最近我在某个perl脚本中遇到了这样的事情:
while(<FH>){
$var1 = <FH>; $var2 = $_
}
由于内部带有文件句柄名称的菱形运算符的工作方式与 readline(FH) 相同;请问这样写有什么特殊含义吗?
非常感谢
最佳答案
让我们查看直接问题的文档。
来自readline
This is the internal function implementing the
<EXPR>
operator, but you can use it directly. The<EXPR>
operator is discussed in more detail in I/O Operators in perlop
以及 I/O Operators我们找到声明
<FILEHANDLE>
may also be spelledreadline(*FILEHANDLE)
. See readline.
因此<FH>
和readline(FH)
是等价的(我们可以将 *FH
或 FH
传递给 readline()
)。
请注意,词法文件句柄优于类型团。请参阅Typeglobs and Filehandles in perldata例如。所以打开你的文件就像
open my $fh, '<', $file or die "Can't open $file: $!";
然后你就做<$fh>
读取“从文件句柄”(从与其关联的文件)。
运算符(operator)<>
不过,它本身还有一些其他属性。查看广泛的perlop
讨论。
问题中的其余代码片段带来了其他问题。
<FH>
里面while
条件位于标量上下文中,因此它从连接到 FH
的资源中读取一行。 。当我们进入循环体时,<FH>
将再次读取一行,然后读取下一行,并将其分配给 $var1
。
何时 <$FH>
是 while
内唯一的东西有条件的话,该行将被分配给默认值 variable $_
。请参阅I/O Operators
上面链接了。所以$var2
被分配到这一行。
因此,在执行循环体之后,我们得到 $var2
中的第一行和 $var1
中的下一行。这个奇怪的循环在每次迭代中都会遍历两行,首先分配两行中的第二行,然后分配第一行。
关于perl - Perl 中 $var = <FH> 和 $_ 之间的区别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45204822/