我在 Internet 上看到了很多使用$/
perl over 的示例,split
但我无法理解其用法。
有谁能解释一下我们如何在 Perl 中使用$/
over吗?split
如果在标量上下文中使用readline $filehandle
(or <$filehandle>
),它将返回文件中未读部分的剩余部分,直到并包括下一次出现在$/
. 默认情况下,这设置为换行符,因此返回文件的下一行。
my $line = <$filehandle>
和
while (<$filehandle>) { ... }
两者都施加标量上下文,因此变量设置为文件的下一行,并且循环在变量中一次执行文件的一行$_
。
$/
如果文件中的数据单元超过几行,更改 的值有时会很有用。例如,如果文件包含}
在行尾总是以 a 结尾的块,那么您可以设置$/ = "}\n"
. 然后你会得到一切,直到返回块的下一个结尾,可能带有嵌入的换行符。
有几个特殊值$/
。将其设置为空字符串$/ = ''
将使 Perl 返回所有内容,直到文件中出现一个或多个空行。显然,这仅在文件中的数据被分隔为带有空行的单元时才有用。
设置$/
为undef
将允许读取一直持续到文件末尾。这就是将文件插入内存的意思,有时对于小文件很实用。如果绝对有必要,最好local
在一个小代码块的范围内使用,例如
my $data = do {
open my $filehandle, '<', 'file.txt' or die $!;
local $/;
<$filehandle>;
};
设置$/
为对数值的引用将强制读取在特定数量的字符后停止。例如,$/ = \4096
将为readline
您从文件中获取下一个 4KB 的数据(如果剩余少于 4KB,则为文件的其余部分)。这可以用于特殊目的,例如缓存您自己的文件读取。
通过“$/
在 Perl 中使用split
”,我想您的意思是这与在整个文件上使用之间的区别,split
整个文件都变成了一个标量变量。主要考虑因素是内存空间。如果文件超过几 KB,那么在不完全必要的情况下一次将其全部读入 Perl 变量是非常浪费的。使用$/
andwhile
将允许一次仅将一条记录读入内存、处理并在读取下一条记录时丢弃。
如果您认为您需要数组中的所有文件,以便您可以向后和向前看,例如,您应该考虑Tie::File
使整个文件看起来好像在数组中的模块(甚至让您修改它)但实际上会根据需要将数据分页进出内存。
使用的一个优点split
是它需要一个正则表达式来识别拆分字符串的位置。这与$/
只能设置为简单字符串的情况相反。如果您需要以更复杂的方式划分文件,这可能很有用。
通常,$/
与 with 一起使用while
是读取文件的最佳方式,并且应该是您的首选,除非有一个压倒一切的原因需要不同的东西。它将防止过度使用内存,并通过迫使您一次专注于单个数据记录来鼓励更好的编程。
来自 Perl 文档
$/ 和 $\ 分别是输入和输出记录分隔符。当您读取或写入数据时,它们控制定义“记录”的内容。
默认情况下,使用的分隔符是\n
. 然而,
如果文件包含,
Lorem ipsum dolor sit amet, --- consectetuer --- adipiscing elit.
定义$/ = "---\n";
, 将使分隔符---
而不是\n
相应地读入。您在分隔符处“拆分”了字符串。
不知道你在说什么例子,但有人可能会认为
my @lines = split $/, $very_long_string;
类似于将文件放入数组中,如
my @lines = <$FILE>;
但是,它并不完全相同,因为 of 的第一个参数split
是一个正则表达式,而 while$/
仅被解释为一个字符串。对于 的默认值$/
,没有区别,但是将其设置为 eg.
应该会显示出区别。