我见过很多使用$/
在Internet上使用的Internet上的例子,但是我不明白这个用法。
能否请你解释一下,我们如何在Perl中使用$/
而不是split
?
我见过很多使用$/
在Internet上使用的Internet上的例子,但是我不明白这个用法。
能否请你解释一下,我们如何在Perl中使用$/
而不是split
?
从Perl的文档
$ /和$ \其分别输入和输出记录分隔符 。当你读取或写入数据时,它们控制什么定义了“记录”。
默认情况下,使用的分隔符是\n
。 然而,
如果文件中包含,
Lorem ipsum dolor sit amet, --- consectetuer --- adipiscing elit.
定义$/ = "---\n";
,会使隔膜---
而不是\n
并相应地读入。您在分隔符处“分割”了字符串。
我同意你的看法但是如果我设置了这个变量,那么当我询问用户输入时,它不会让我停止输入值,直到我按下这个变量的值。为什么它与此有关? – 2012-07-29 09:54:08
那么,正如我所说的,'$ /'是**输入**记录分隔符。 Perl没有意识到记录已经结束,直到它与该令牌一起呈现。默认情况下,它是换行符。 – 2012-07-29 09:55:15
@PrashantTiwari:键盘缓冲与$ /'变量无关。在正常情况下,当您要求操作系统从键盘读取数据时,只有按下Enter键时才会返回一个值。在从系统的输入接收到Perl数据之前,Perl不能将数据传递给您的程序,并且'$ /'的默认值为换行符是巧合。如果你把它设置为别的东西,那么你的程序仍然会等待,直到按下Enter键,但是输入中的字符将以不同的方式分割 – Borodin 2012-07-29 10:32:42
不知道你在说什么的例子,但有人可能会认为,
my @lines = split $/, $very_long_string;
类似于啜文件到一个数组,如
my @lines = <$FILE>;
虽然这并不完全相同,但split
的第一个参数是一个正则表达式,而$/
仅被解释为字符串。对于默认值$/
,没有区别,但将其设置为例如.
应显示差异。
如果在标量环境下使用readline $filehandle
(或<$filehandle>
),它会返回该文件的未读部分的剩余部分直至并包括字符串的$/
下一次出现。默认情况下,它被设置为换行符,因此文件的下一行被返回。
my $line = <$filehandle>
和
while (<$filehandle>) { ... }
两者施加标量上下文,因此该变量被设置为文件的下一行,并且该环与所述文件的一行,在一时间在$_
变量执行。
如果文件中的数据单元延伸到多行,有时可能会更改$/
的值。例如,如果文件包含的块总是在行尾以}
结尾,那么您可以设置$/ = "}\n"
。然后你会得到一切,直到返回的块的下一个结束,可能嵌入换行符。
$/
有几个特殊值。将它设置为空字符串$/ = ''
将使Perl返回一切,直到文件中有一个或多个空行。显然这只有在你的文件中的数据被分隔成空行的单元时才有用。
设置$/
到undef
将允许读取继续直到文件结尾。这是什么意思sl 012该文件到内存中,有时对于小文件很实用。如果它是绝对必要的它使用一个小代码块的范围内local
像
my $data = do {
open my $filehandle, '<', 'file.txt' or die $!;
local $/;
<$filehandle>;
};
设置$/
到参考数值将强制读取字符的具体数量后停止做得最好。例如$/ = \4096
将使readline
为您从文件中提取下一个4KB的数据(或者如果剩余的文件少于4KB,则文件的其余部分)。这可以用于缓存自己的文件读取等特殊用途。
作者:“使用$/
in Perl over split
”我想你是指在整个文件中使用split
变成标量变量的区别。主要考虑的是内存空间。如果文件大于几KB,那么如果不是完全必要的话,将它全部读入Perl变量是非常浪费的。使用$/
和while
将一次只允许一条记录读入内存,在读取下一条记录时进行处理和丢弃。
如果你认为你需要的所有文件的一个数组,这样就可以向后看以及前锋,例如,你应该考虑Tie::File
模块,这将使它出现如果整个文件是为一个数组(甚至可以修改它),但实际上会根据需要将数据分为内存和外存。
使用split
的优点是需要regualr表达式来标识拆分字符串的位置。这与$/
相反,它只能设置为简单的字符串。如果您需要以更复杂的方式分割文件,这可能很有用。
一般来说,使用$/
连同while
是阅读文件的最佳方式,应该是您的第一选择,除非您有一个压倒性的理由,您为什么需要不同的东西。它将防止奢侈的内存使用,并通过强迫您一次专注于单个数据记录来鼓励更好的编程。
你能发表一个你不明白的例子吗?文档(http://perldoc.perl.org/perlvar.html)非常清晰。 – Mat 2012-07-29 09:46:39