IO::Handle->input_record_separator( EXPR )
$INPUT_RECORD_SEPARATOR
$RS
$/

输入记录分隔符,默认值为换行符。这会影响 Perl 对“行”的理解。与 awk 的 RS 变量的工作方式相同,包括在设置为空字符串时将空行视为终止符(空行不能包含任何空格或制表符)。您可以将其设置为多字符字符串以匹配多字符终止符,或设置为 undef 以读取到文件末尾。将其设置为 "\n\n" 与将其设置为 "" 的含义略有不同,如果文件包含连续的空行。设置为 "" 将把两个或多个连续的空行视为单个空行。设置为 "\n\n" 将盲目地假设下一个输入字符属于下一段,即使它是换行符。

local $/;           # enable "slurp" mode
local $_ = <FH>;    # whole file now here
s/\n[ \t]+/ /g;

请记住:$/ 的值是一个字符串,而不是一个正则表达式。awk 必须在某些方面更强大。:-)

$/ 设置为空字符串——所谓的段落模式——值得特别注意。当 $/ 设置为 "" 并且整个文件以该设置读取时,文件开头任何一个或多个连续换行符的序列都会被丢弃。除了文件中的最后一个记录外,以两个或多个换行符结尾的每个字符序列都被视为一个记录,并被读入以恰好以两个换行符结尾。如果文件中的最后一个记录以零个或一个连续换行符结尾,则该记录将以该数量的换行符读入。如果最后一个记录以两个或多个连续换行符结尾,则它将像所有前面的记录一样以两个换行符读入。

假设我们将以下字符串写入文件

my $string = "\n\n\n";
$string .= "alpha beta\ngamma delta\n\n\n";
$string .= "epsilon zeta eta\n\n";
$string .= "theta\n";

my $file = 'simple_file.txt';
open my $OUT, '>', $file or die;
print $OUT $string;
close $OUT or die;

现在我们以段落模式读取该文件

local $/ = ""; # paragraph mode
open my $IN, '<', $file or die;
my @records = <$IN>;
close $IN or die;

@records 将包含以下 3 个字符串

(
  "alpha beta\ngamma delta\n\n",
  "epsilon zeta eta\n\n",
  "theta\n",
)

$/ 设置为对整数的引用、包含整数的标量或可转换为整数的标量将尝试读取记录而不是行,最大记录大小为引用的整数字符数。因此,这

local $/ = \32768; # or \"32768", or \$var_containing_32768
open my $fh, "<", $myfile or die $!;
local $_ = <$fh>;

将从 $fh 读取不超过 32768 个字符的记录。如果您没有从面向记录的文件读取(或您的操作系统没有面向记录的文件),那么您可能会在每次读取时获得一整块数据。如果记录大于您设置的记录大小,您将分段获取记录。尝试将记录大小设置为零或更小已被弃用,并将导致 $/ 的值为“undef”,这将导致读取(剩余的)整个文件。

从 5.19.9 开始,将 $/ 设置为任何其他形式的引用将抛出致命异常。这是为了准备将来支持设置 $/ 的新方法。

仅在 VMS 上,记录读取会绕过 PerlIO 层和任何相关的缓冲,因此您不能在同一个文件句柄上混合记录读取和非记录读取。仅当相同缓冲层用于两种模式时,记录模式才会与行模式混合。

您不能在句柄上调用 input_record_separator(),只能作为静态方法调用。请参阅 IO::Handle

另请参阅 "Newlines" in perlport。另请参阅 "$."

助记符:/ 在引用诗歌时分隔行边界。