如何在Perl中检查eof?

时间:2010-02-03 21:54:38

标签: perl eof

因此,在以下情况下,我有一些问题可以解决Perl的作用:

while(1){
$inputLine=<STDIN>

#parse $inputLine below
#BUT FIRST, I need to check if $inputLine = EOF

}

在我得到使用while(<>){}的明显答案之前,让我说有一个非常强大的理由我必须做上述事情(基本上设置一个警报来中断阻止,我不希望代码到杂乱的例子)。

有没有比较$inputLine == undef(因为我认为这是STDIN最后返回的)。

感谢。

4 个答案:

答案 0 :(得分:11)

在循环中,使用

last unless defined $inputLine;

来自perlfunc documentation on defined

  

定义EXPR
  的定义

     

返回一个布尔值,告知EXPR是否具有未定义值undef以外的值。如果EXPR不存在,则会检查$_

     

许多操作返回undef以指示失败,文件结束,系统错误,未初始化的变量和其他异常情况。此功能允许您将undef与其他值区分开来。 (一个简单的布尔测试不会区分undef,零,空字符串和"0",它们都同样是假的。)注意,因为undef是一个有效的标量,它的存在并不一定表示异常情况:pop在其参数为空数组时返回undef,或者当要返回的元素恰好是undef时返回。{/ p>

答案 1 :(得分:4)

defined($inputLine)

另外,请参阅4 argument version of the select function,了解从文件句柄中读取而不会阻止的替代方法。

答案 2 :(得分:0)

您可以在文件句柄上使用eof。如果FILEHANDLE上的下一次读取是EOF, eof 将返回1。

答案 3 :(得分:0)

以下内容将对输入行中只有换行符的行出现问题,或者在某些行的开头出现FF的情况下(换页-文件是程序的输出在20世纪70年代末开发的,并且仍然具有用于行式打印机的格式,并且仍在FORTRAN中-我确实想念背面用于绘制流程图的宽幅连续纸)。

open (SIMFIL, "<", 'InputFileName') or die "Can´t open InputFileName\n" ;
open (EXTRDATS, ">>", 'OutputFileName' ) or die "Can´t open OutputFileName\n";
$Simfilline = "";
while (<SIMFIL>) {
    $Simfilline = <SIMFIL>;
    print EXTRDATS $Simfilline;
    $Simfilline = <SIMFIL>;
    print EXTRDATS $Simfilline;
    }
close SIMFIL;
close EXTRDATS;

` 以下是eof派上用场的时候-表达式:“ while()”在文件末尾以外的条件下可以返回false。

open (SIMFIL, "<", 'InputFileName') or die "Can´t open InputFileName\n" ;
open (EXTRDATS, ">>", 'OutputFileName' ) or die "Can´t open OutputFileName\n";
$Simfilline = "";
while (!eof SIMFIL) {
    $Simfilline = <SIMFIL>;
    print EXTRDATS $Simfilline;
    $Simfilline = <SIMFIL>;
    print EXTRDATS $Simfilline;
    }
close SIMFIL;
close EXTRDATS;

最后一个代码片段似乎完全复制了输入文件。