在perl中误解了filehandle(或数组?)?

时间:2015-06-06 02:53:53

标签: arrays perl filehandle

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)不正确)。非常感谢。

1 个答案:

答案 0 :(得分:2)

在Perl中,当您从列表上下文中的文件句柄中读取时,它会自动读取到文件的末尾。 $_为空,因为整个文件已被读入@array,并且文件句柄已移至EOF。 Perl对标量和列表中的相同指令的不同处理&#34; context&#34;是不寻常的,但文件句柄本身的行为在语言中非常标准。通常,文件句柄或输入流将允许您一次读取一行,一次读取一个字节,或一次读取整个文件,并具有一个指针,用于跟踪您读取的文件中的最后一个位置。通过在列表上下文中进行读取而无意中将指针一直移动到文件末尾(EOF)时,下一次读取行的调用发现没有更多文件需要读取。这是scalar and list context的一个很好的解释;这可能是这里发生的更棘手的部分。