私はR. Bemroseに投票しましたが、$fh がFILE HANDLEclose
である場合は、終了する前にそれを使用することもできます。
また、printf
間違った使い方をしています。printf は「印刷ファイル」ではありません。その「印刷形式」。
その最後の例では
print $fh 'Message' ;
は、あなたが必要とすることすべてです。
printf
次のように使用することを意図しています。
printf $fh 'some format %s and more %s ' , $var , $var ;
また
printf 'some format %s and more %s ' , $var , $var ;
そしてそれはすることと同等です
print $fh sprintf 'format %s more %s' , $var , $var ;
このため、連結された変数のいずれかが展開されて「%」が含まれる場合に、不要なコード リスクが発生します。この罠に陥る例については、Q:308417: Perl スクリプトがファイルから文字を削除するのはなぜですか?を参照してください。
perldoc -f print
ファイルハンドルリストを出力
リストを印刷
print 文字列または文字列のリストを出力します。
perldoc -f printf
printf ファイルハンドル形式、リスト
printf フォーマット、リスト
「$\」を除いて、「print FILEHANDLE sprintf(FORMAT, LIST)」と同等
(出力レコード区切り) は追加されません
さらなる調査
「バッファリング」状態が発生しないため、問題をさらに調査しました。フラッシュするかどうかに関係なく、すべてのファイルが適切にフラッシュされます。(Perl 5.10)。
私が試しているコードスニペットは次のとおりです。
#!/usr/bin/perl
use strict;
use warnings;
open my $fh , '>' , '/tmp/oo.txt';
my $exit_at = int(rand( 200_000 ));
print "$exit_at\n";
sleep 2;
for ( 0 .. ( $exit_at * 2 ) ){
print $fh $_;
if ( $_ == $exit_at ){
printf $fh '%n' ; # Bad Code Causes Early Death.
printf $fh 'last line';
exit;
}
if ( $_ % 1000 ){
print $fh "\n";
}
}
私はprintfの誤用を使用しています。コメントされた行は、「n」パラメーターを提供していないために有効ではないため、エラーメッセージを排出し、次のように終了します。
Modification of a read-only value attempted at iotest.pl line 15.
「最後の行」の印刷を実行する前に(これも悪いですが、%記号がないので問題ありません)、出力ファイルに「最後の行」がありません。
printf を修正し、代わりに plain-old-print を使用して、問題が解決するかどうかを確認してください。