我想在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;
}
答案 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;
}
}