读取STDIN上的记录会产生未初始化的值错误

时间:2013-03-15 13:38:30

标签: perl stdin

我想在stdin上以交互方式阅读记录。 CTRL + D标记记录的结尾。它会一直持续到按下ctrl + c。我的代码产生了以下错误:

Use of uninitialized value in open 
Use of uninitialized value in <HANDLE>

通过测试$ rec可以避免错误,我必须这样做才能跳过空记录。但我觉得我正在掩饰一个我不太了解的问题。我怀疑stdin正在关闭,但我不确定。你能解释一下错误发生的原因以及如何修复我的循环吗?

my $eof = $INPUT_RECORD_SEPARATOR;
while (1) {
  local $INPUT_RECORD_SEPARATOR = chr(0x04);
  my $rec = <STDIN>;

  # format last record that ended with ^D
  local $INPUT_RECORD_SEPARATOR = $eof;
  open my $input, "<", \$rec;    
  my_formatting_func $input;
  close $input;
}

1 个答案:

答案 0 :(得分:0)

您的代码无论如何都不会起作用,因为format需要输出文件句柄名称和图片格式作为参数,并且您正在为它提供输入文件句柄引用。

然而,问题是在Perl程序看到之前,控制-D由C库处理。它会导致流关闭,随后对readfile的调用将返回undef

只需写下

last unless defined $rec;

您将获得完整的输入记录。最重要的是,使用通常的习语并写

{
    my $eof = $INPUT_RECORD_SEPARATOR;
    local $INPUT_RECORD_SEPARATOR;
    while (my $rec = <STDIN>) {
        local $INPUT_RECORD_SEPARATOR = $eof;
        open my $input, "<", \$rec;    
        format $input;
        close $input;
    }
}