Perl中$ var = <fh>和$ _之间的区别

时间:2017-07-20 03:52:02

标签: perl

最近我在某个perl脚本中遇到过类似的内容:

while(<FH>){
    $var1 = <FH>; $var2 = $_
}

由于内部具有文件句柄名称的菱形运算符的工作方式与readline(FH)相同;我可以知道这样的写作有什么特别的意义吗?

非常感谢

1 个答案:

答案 0 :(得分:4)

让我们了解直接问题的文档。

来自readline

  

这是实现<EXPR>运算符的内部函数,但您可以直接使用它。在I/O Operators in perlop

中更详细地讨论了<EXPR>运算符

并在I/O Operators中找到声明

  

<FILEHANDLE>也可拼写为readline(*FILEHANDLE)。请参阅readline

因此<FH>readline(FH)是等效的(我们可以将*FHFH传递给readline())。

请注意,词法文件句柄比typeglobs更受欢迎。例如,请参阅Typeglobs and Filehandles in perldata。所以打开你的文件,如

open my $fh, '<', $file or die "Can't open $file: $!";

然后你<$fh>从文件句柄&#34;中读取&#34; (来自与之关联的文件)。

运算符<>本身也有一些其他属性。请参阅广泛的perlop讨论。

问题中其余的代码段会带来其他问题。

<FH>条件中的while位于标量上下文中,因此它从连接到FH的资源中读取一行。当我们进入循环体时,<FH>再次读取一行,即下一行,分配给$var1

<$FH>while条件中的唯一内容时,该行将被分配到默认variable $_。请参阅上面链接的I/O Operators。因此$var2被分配了这一行。

因此,在执行循环体之后,我们在$var2中有第一行,在$var1中有下一行。这个奇怪的循环在每次迭代中都会超过两行。