0

標準入力で対話的にレコードを読みたい。CTRL+D は、レコードの終わりを示します。ctrl+c が押されるまで永遠に続きます。私のコードは次のエラーを生成しています:

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

null レコードをスキップするために必要な $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 に答える