2012-07-29 44 views
4

我见过很多使用$/在Internet上使用的Internet上的例子,但是我不明白这个用法。

能否请你解释一下,我们如何在Perl中使用$/而不是split

+5

你能发表一个你不明白的例子吗?文档(http://perldoc.perl.org/perlvar.html)非常清晰。 – Mat 2012-07-29 09:46:39

回答

2

从Perl的文档

$ /和$ \其分别输入和输出记录分隔符 。当你读取或写入数据时,它们控制什么定义了“记录”。

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

如果文件中包含,

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

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

(Reference)

+0

我同意你的看法但是如果我设置了这个变量,那么当我询问用户输入时,它不会让我停止输入值,直到我按下这个变量的值。为什么它与此有关? – 2012-07-29 09:54:08

+1

那么,正如我所说的,'$ /'是**输入**记录分隔符。 Perl没有意识到记录已经结束,直到它与该令牌一起呈现。默认情况下,它是换行符。 – 2012-07-29 09:55:15

+2

@PrashantTiwari:键盘缓冲与$ /'变量无关。在正常情况下,当您要求操作系统从键盘读取数据时,只有按下Enter键时才会返回一个值。在从系统的输入接收到Perl数据之前,Perl不能将数据传递给您的程序,并且'$ /'的默认值为换行符是巧合。如果你把它设置为别的东西,那么你的程序仍然会等待,直到按下Enter键,但是输入中的字符将以不同的方式分割 – Borodin 2012-07-29 10:32:42

2

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

my @lines = split $/, $very_long_string; 

类似于啜文件到一个数组,如

my @lines = <$FILE>; 

虽然这并不完全相同,但split的第一个参数是一个正则表达式,而$/仅被解释为字符串。对于默认值$/,没有区别,但将其设置为例如.应显示差异。

7

如果在标量环境下使用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是阅读文件的最佳方式,应该是您的第一选择,除非您有一个压倒性的理由,您为什么需要不同的东西。它将防止奢侈的内存使用,并通过强迫您一次专注于单个数据记录来鼓励更好的编程。