Perl的新手(以及一般的语言),并且已经达到了OPEN FH
。
对以下两种情况有点困惑(输出不同,但我无法理解为什么第二种情况是"错误")。
脚本1
#! usr/bin/perl
use warnings;
use strict;
open FILE, "example.txt" or die $!;
while (<FILE>) {
print $_;
}
SCRIPT2
#! usr/bin/perl
use warnings;
use strict;
open FILE, "example.txt" or die $!;
my @array = <FILE>;
while (<FILE>) {
print $_;
}
example.txt包含3行句子。当我将文件句柄FILE
分配给数组时,突然,$_
变为空??
如果我将<FILE>
循环中的while
替换为数组(@array
),则循环无法停止,$_
变为&#34;未初始化的值&#34;。
这可能是对filehandle
和数组的一个非常基本的误解,但有人可以帮助解释一下 - 用简单的英语 - ?或者指向我可以找到更多信息的参考文献(有一些参考资料并且已经咨询过它们,但显然我仍然不能理解为什么脚本2(和3)不正确)。非常感谢。
答案 0 :(得分:2)
在Perl中,当您从列表上下文中的文件句柄中读取时,它会自动读取到文件的末尾。 $_
为空,因为整个文件已被读入@array
,并且文件句柄已移至EOF
。 Perl对标量和列表中的相同指令的不同处理&#34; context&#34;是不寻常的,但文件句柄本身的行为在语言中非常标准。通常,文件句柄或输入流将允许您一次读取一行,一次读取一个字节,或一次读取整个文件,并具有一个指针,用于跟踪您读取的文件中的最后一个位置。通过在列表上下文中进行读取而无意中将指针一直移动到文件末尾(EOF
)时,下一次读取行的调用发现没有更多文件需要读取。这是scalar and list context的一个很好的解释;这可能是这里发生的更棘手的部分。