输入记录分隔符,默认值为换行符。这会影响 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。另请参阅 "$."。
助记符:/ 在引用诗歌时分隔行边界。