最近我在某个perl脚本中遇到过类似的内容:
while(<FH>){
$var1 = <FH>; $var2 = $_
}
由于内部具有文件句柄名称的菱形运算符的工作方式与readline(FH)
相同;我可以知道这样的写作有什么特别的意义吗?
非常感谢
答案 0 :(得分:4)
让我们了解直接问题的文档。
来自readline
这是实现
中更详细地讨论了<EXPR>
运算符的内部函数,但您可以直接使用它。在I/O Operators in perlop<EXPR>
运算符
并在I/O Operators中找到声明
<FILEHANDLE>
也可拼写为readline(*FILEHANDLE)
。请参阅readline。
因此<FH>
和readline(FH)
是等效的(我们可以将*FH
或FH
传递给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
中有下一行。这个奇怪的循环在每次迭代中都会超过两行。