0

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

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

通过测试 $rec 可以避免错误,我必须这样做才能跳过空记录。但我觉得我在掩盖一个我不太明白的问题。我怀疑标准输入正在关闭,但我不确定。你能解释为什么会发生错误以及如何修复我的循环吗?

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;
}
4

1 回答 1

0

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

然而,问题是控制-D 是在 Perl 程序看到它之前由 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;
    }
}
于 2013-03-15T13:50:01.150 回答