在perl中使用$ /

Pra*_*ari 4 perl

$/在perl上看过很多关于Internet使用的例子,split但是我无法理解它的使用.

任何能否请您解释我们如何使用$/split在Perl?

Bor*_*din 8

如果在标量上下文中使用readline $filehandle(或<$filehandle>),它将返回文件未读部分的剩余部分,包括下一次出现的字符串$/.默认情况下,它设置为换行符,因此返回文件的下一行.

my $line = <$filehandle>
Run Code Online (Sandbox Code Playgroud)

while (<$filehandle>) { ... }
Run Code Online (Sandbox Code Playgroud)

两者都施加标量上下文,因此变量设置为文件的下一行,并且循环在$_变量中一次执行一行文件.

$/如果文件中的数据单元扩展到多行,则更改值有时会很有用.例如,如果文件包含始终}以行尾结尾的块,则可以设置$/ = "}\n".然后你会得到一切,直到块的下一个结束返回,可能有嵌入的换行符.

有几个特殊值$/.将它设置为空字符串$/ = ''将使Perl返回所有内容,直到文件中的一个或多个空行.显然,只有当文件中的数据被分成带有空行的单位时,这才有用.

设置$/undef允许读取继续直到文件末尾.这就是将文件啜饮到内存中的含义,有时对于小文件也是实用的.如果绝对必要,最好local在小代码块的范围内使用

my $data = do {
  open my $filehandle, '<', 'file.txt' or die $!;
  local $/;
  <$filehandle>;
};
Run Code Online (Sandbox Code Playgroud)

设置$/数值的引用将强制读取在特定数量的字符后停止.例如,$/ = \4096将为您readline提取文件中的下一个4KB数据(如果剩余少于4KB,则从文件的其余部分获取).这可以用于特殊目的,如缓存您自己的文件读取.

通过" $/在Perl中使用split",我想你的意思是这个和使用split整个文件之间的差异徘徊在一个标量变量中.主要考虑因素是内存空间.如果文件超过几KB,那么如果不是完全必要的话,将它全部读入Perl变量是非常浪费的.在读取下一条记录时,使用$/while将允许一次只读取一条记录,处理和丢弃.

如果您认为您需要数组中的所有文件,以便您可以向后看以及向前看,您应该考虑使Tie::File模块看起来好像整个文件都在一个数组中(甚至让你看看)修改它)但实际上将根据需要在内存中分页数据.

使用的一个优点split是它需要一个regualr表达式来识别分割字符串的位置.与此相反,$/它只能设置为简单的字符串.如果您需要以更复杂的方式划分文件,这可能很有用.

一般来说,$/一起使用while是阅读文件的最佳方式,应该是您的首选,除非您需要不同的东西.它可以防止过度使用内存,并通过强制您一次专注于单个数据记录来鼓励更好的编程.


Ani*_*han 2

来自 Perl 文档

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

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

如果文件包含,

Lorem ipsum dolor sit amet, --- consectetuer --- adipiscing elit. 
Run Code Online (Sandbox Code Playgroud)

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

(参考)

  • @PrashantTiwari:键盘缓冲与“$/”变量无关。在正常情况下,当您要求操作系统从键盘读取数据时,仅当按下“Enter”键时,它才会返回一个值。Perl 无法将数据传递给您的程序,直到它从系统输入接收到数据,而“$/”的默认值是换行符,这也是巧合。如果您将其设置为其他内容,那么您的程序仍将等待,直到按下“Enter”,但输入中的字符将以不同的方式分割 (2认同)