-1

2つの異なるファイルに印刷しようとしています。何らかの理由で、printステートメントは一方のファイルでは正常に機能しますが、もう一方のファイルでは機能しません。このプログラムを実行すると、filter2.outは「Beginning」という1行で構成されます。filter2.errは空のままです。

open(OUTPUT, "> Filter2/filter2.out");
open(ERROR, "> Filter2/filter2.err");
print OUTPUT "Beginning\n";
print ERROR "Beginning\n";

更新:それで、私はこれをより大きなプログラムの始めに実行していて、それがバッチで、またはファイルが閉じられたときにのみERRORファイルを更新することに気づきました。なぜこれが発生するのか考えてみてください。

4

2 に答える 2

9

追加を検討してください

use strict;
use warnings;

スクリプトの先頭に移動します。これらのステートメントは、Perlによって黙って無視されるエラーをキャッチするのに役立ちます。さらに、open呼び出しにエラーチェックを追加することを検討してください。おそらく、実際には開いていません。私はそれを次のように書きます:

use strict;
use warnings;

open(OUTPUT, "> Filter2/filter2.out")
    or die "Can't open filter2.out: $!";
open(ERROR, "> Filter2/filter2.err")
    or die "Can't open filter2.err: $!";
print OUTPUT "Beginning\n";
print ERROR "Beginning\n";

たとえば、厳密な警告と警告を追加するだけで、次のようになります。

print() on closed filehandle OUTPUT at .\printer.pl line 6.
print() on closed filehandle ERROR at .\printer.pl line 7.

うーん...!

エラーチェックを追加することで、次のようになりました。

PS C:\dev> perl .\printer.pl
Can't open filter2.out: No such file or directory at .\printer.pl line 4.

ああ!見て、私はフォルダを持っていませんでした。フォルダを追加した後、すべてが正常に実行されました。あなたはおそらく似たようなものを見つけるでしょう。

最後に、おそらく最新の字句ファイルハンドルも使用する必要があります。これは、他のエラー(再利用されたハンドル名など)をキャッチするのに役立ちます。したがって、最終的なスクリプトは次のようになります。

use strict;
use warnings;

open(my $output, ">", "Filter2/filter2.out")
    or die "Can't open filter2.out: $!";
open(my $error, ">", "Filter2/filter2.err")
    or die "Can't open filter2.err: $!";
print $output "Beginning\n";
print $error "Beginning\n";

ビオラ!これで、問題が失敗したときに問題がどこで失敗したかを正確に確認でき、後で作成する他のライブラリやコードが誤ってファイルハンドルに干渉しないことを確認できます。

于 2013-01-16T18:27:06.553 に答える
1

ファイルが正しく開かれたことを確認する必要があります。また、ファイルハンドルとして、裸の単語ではなくローカル変数を使用することをお勧めします。

open( my $err, "> Filter2/filter2.err") or die "Couldn't open error: $!"
print $err "Beginning\n"
于 2013-01-16T18:23:20.367 に答える