5

我在 Internet 上看到了很多使用$/perl over 的示例,split但我无法理解其用法。

有谁能解释一下我们如何在 Perl 中使用$/over吗?split

4

3 回答 3

10

如果在标量上下文中使用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是读取文件的最佳方式,并且应该是您的首选,除非有一个压倒一切的原因需要不同的东西。它将防止过度使用内存,并通过迫使您一次专注于单个数据记录来鼓励更好的编程。

于 2012-07-29T10:27:50.557 回答
2

来自 Perl 文档

$/ 和 $\ 分别是输入和输出记录分隔符。当您读取或写入数据时,它们控制定义“记录”的内容。

默认情况下,使用的分隔符是\n. 然而,

如果文件包含,

Lorem ipsum dolor sit amet, --- consectetuer --- adipiscing elit. 

定义$/ = "---\n";, 将使分隔符---而不是\n相应地读入。您在分隔符处“拆分”了字符串。

(参考)

于 2012-07-29T09:48:35.993 回答
2

不知道你在说什么例子,但有人可能会认为

my @lines = split $/, $very_long_string;

类似于将文件放入数组中,如

my @lines = <$FILE>;

但是,它并不完全相同,因为 of 的第一个参数split是一个正则表达式,而 while$/仅被解释为一个字符串。对于 的默认值$/,没有区别,但是将其设置为 eg.应该会显示出区别。

于 2012-07-29T09:53:11.093 回答