1

ファイル サイズをすばやく変更しようとしていますが、ファイルが適切なサイズにならないという問題が発生しています。以下のコードは、私が思うように動作していますか? 主に、$|オペレーターが実際に を選択しているのか、$fhそれとも選択しているのSTDOUTか?

# Open file, hot buffer
open(my $fh, '>>', $file_path) ||
   die 'Could not open temp file: '.$!;
$| = TRUE;

# Make file longer (div 2 because 
# we print 2 at a time)
print $fh "\r\n" x ($diff / 2);

# Wait for file system to catch
# up, then close file.
sleep 1;
close $fh;
4

1 に答える 1

10

あなたはこれを考えているかもしれません

$| = TRUE;  

$|真の値に設定します。しかし、これは間違っています。警告を有効にすると、次の警告が表示されます。

Argument "TRUE" isn't numeric in scalar assignment

$|そして、それが実際に0(false)であることがわかります。これはTRUE、(定数を含むモジュールがロードされていない限り) ベアワードであり、文字列として解釈され、数値に変換され、0この場合はゼロになるためです。したがって、代わりに次のようにします。

$| = 1;

1この特定の変数は、またはの値のみを持つことができます0。直接設定できます。その場合、現在select()編集されているファイル ハンドル (デフォルトでは STDOUT) に影響します。または、オブジェクト指向表記を使用できます

STDOUT->autoflush(1);  # this is what you did
$fh->autoflush(1);     # this is what you want

したがって、上記のコードでは、期待どおりに動作させるためにこれを行う必要があります。

select($fh);
$| = 1;

ファイルハンドルを閉じると、それに影響を与えるすべてのバッファがフラッシュされることを知っておく必要があります。

于 2013-10-16T16:29:12.373 に答える