4

このコード:

foreach my $file (@data_files) {

    open my $fh, '<', $file || croak "Could not open file $file!\n";
    my @records = <$fh>;
    close $fh;

    ....

}

このエラーが発生します:

readline() on closed filehandle $fh at nut_init_insert.pl line 29.

理由はわかりません。

open編集:元の投稿には、ステートメントに「<」ではなく「、」が含まれていました。

4

2 に答える 2

11

投稿したコード(の2番目の引数open)にタイプミスがありますが、それはエラーメッセージを説明していません。その問題のメッセージは次のようになります。

Unknown open() mode ',' at ...

あなたの問題は優先順位に関連しています。バインドがきつすぎるため、Perlはこの||式全体を開くための3番目の引数として扱います。

$file || croak $!

その結果、open失敗しても(おそらく$file有効なファイル名でcroakはないため)、実行されません($filetrueであり、||短絡しているため)。失敗した後、openプログラムは開いていないファイルハンドルからいくつかの行を読み取ろうとし、次のエラーメッセージが表示されます。

readline() on closed filehandle $fh at ...

代わりに、次のいずれかを使用します。or2番目のオプションは、優先順位が低いため、(コードとは異なり)機能します。

open(my $fh, '<', $file) || croak ...;

open my $fh, '<', $file or croak ...;

演算子の優先順位の詳細については、perlopを参照してください。あなたの場合の関連するポイントは、||演算子がリスト区切り文字(コンマ)よりも優先されるということです。

于 2010-04-24T13:39:44.077 に答える
1

開く2番目の引数にタイプミスがあります。

open my $fh, '<', $file || croak "Could not open file $file!\n";
于 2010-04-24T12:53:35.110 に答える