5

所以我在弄清楚 Perl 在以下情况下做了什么有点问题:

while(1){
$inputLine=<STDIN>

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

}

在我得到 using 的明显答案之前while(<>){},让我说有一个非常充分的理由我必须执行上述操作(基本上设置一个警报以中断阻塞,我不希望该代码使示例混乱)。

有什么方法可以比较$inputLine == undef(因为我认为这就是 STDIN 最后返回的内容)。

谢谢。

4

4 回答 4

11

在你的循环中,使用

last unless defined $inputLine;

perlfunc 文档中defined

已定义 EXPR 已
定义

返回一个布尔值,表明 EXPR 是否具有未定义值以外的值undef。如果 EXPR 不存在,$_将被检查。

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

于 2010-02-03T21:56:19.300 回答
4
defined($inputLine)

此外,请参阅该函数的4 参数版本,select了解另一种从文件句柄中读取而不阻塞的方法。

于 2010-02-03T21:57:06.257 回答
1

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

于 2010-02-03T21:59:09.557 回答
0

以下将有输入文件的问题,这些文件的行只有一个换行符,或者在某些行的开头给我一个 FF 问题的情况下(Form Feed - 该文件是在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;

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

于 2018-07-13T22:07:34.843 回答