2

私のスクリプトでは、ファイルを開いたり、ファイルに書き込んだりしています。開こうとしたファイルに問題があることがわかりました。ファイルは存在し、空ではなく、ファイルハンドルに正しいパスを渡しています。

質問が奇妙に聞こえるかもしれませんが、コードをデバッグしているときに、スクリプトに次のコマンドを入力して、いくつかのファイルをチェックしました。

system ("ls");

その後、私のスクリプトはうまく機能しましたが、削除すると正しく機能しなくなりました。

 my @unique = ("test1","test2");
 open(unique_fh,">orfs");
 print unique_fh @unique ;
 open(ORF,"orfs")or die ("file doesnot exist");
 system ("ls");
    while(<ORF>){
    split ;
    }
    @neworfs=@_ ;
  print @neworfs ;
4

2 に答える 2

5

Perlは、ファイルに印刷するときに出力をバッファリングします。つまり、言うたびに実際にファイルに書き込むわけではありませんprint。大量のデータを保存し、一度にすべて書き込みます。これはより高速です。

あなたの場合、Perlはまだ何も書き込んでいないため、ファイルに書き込んだものは何も表示されませんでした。ただし、呼び出しを追加するsystem("ls")と、Perlが最初に出力を書き込みます(インタープリターは、system()作成したファイルで何かを行うために呼び出しを使用する可能性があると考えているため、これを行うのに十分賢いです)。

これをどのように回避しますか?chorobaが提案したように、ファイルを再度開いて読み取る前に、ファイルを閉じることができます。または、そのファイルのバッファリングを無効にすることができます。ファイルを開いた直後に次のコードを配置します。

my $fh = select (unique_fh);
$|=1;
select ($fh);

その後、ファイルに出力するたびに、すぐに書き込まれます($|出力のバッファリング動作を設定する特別な変数です)。

読み取りと書き込みを同時に行うためのファイルハンドルを開くことは可能ですが、最初にファイルを閉じることをお勧めします。

于 2012-08-21T14:17:52.613 に答える
3

同じファイルから読み取ろうとする前に、ファイルハンドルを閉じていません。

于 2012-08-21T14:03:14.400 に答える