【问题标题】:How can I check for eof in Perl?如何在 Perl 中检查 eof?
【发布时间】:2010-02-03 21:54:38
【问题描述】:

所以我有点难以理解 Perl 在以下情况下的作用:

while(1){
$inputLine=<STDIN>

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

}

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

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

谢谢。

【问题讨论】:

    标签: perl eof


    【解决方案1】:

    在你的循环中,使用

    last unless defined $inputLine;
    

    来自perlfunc documentation on defined

    定义的 EXPR
    定义

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

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

    【讨论】:

    • 谢谢。我是 perl 新手,但我已经掌握了窍门。
    【解决方案2】:
    defined($inputLine)
    

    另外,请参阅4 argument version of the select function,了解另一种从文件句柄读取而不阻塞的方法。

    【讨论】:

      【解决方案3】:

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

      【讨论】:

      • 来自 eof 文档:“(请注意,此函数实际上读取一个字符,然后是 'ungetc's 它,因此在交互式上下文中不是很有用。)” OP 正在从 STDIN 读取,即, 在交互式环境中。
      • 啊,我只是专注于eof。在进一步阅读时,我还注意到它说您几乎不需要使用 eof,因为您只需查找 undef。有趣 - 我知道我已经使用过几次 eof 了。但我猜是 TMTOWTDI ;)
      【解决方案4】:

      如果输入文件的行只有换行符,或者在某些行的开头给我一个 FF 问题(换页 - 文件是程序的输出),以下内容会出现问题开发于 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;
      

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2020-04-01
        • 2019-07-18
        • 2012-06-18
        • 2019-04-23
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多