2

この質問の言い方が本当にわからないので、私がやろうとしていることの例を挙げます。

スリープ機能を数秒間使用する必要があるスクリプトがあります。しかし、「スリープ」に入る前に、「スリープ中...」などのメッセージが必要です。しかし、スリープが完了したら、「完了」を出力する必要があります。したがって、ターミナルウィンドウは次のようになります: Sleeping... done、これはそのための私のコードです:

#!/usr/bin/perl

print "Sleeping... ";
sleep(1);
print "done";

しかし、何が起こるかというと、スクリプトはスリープ状態になり、Sleeping... done一度にすべてを出力します。

「Sleeping...」を印刷してから実際に「sleep」に移動し、最後に「done」を印刷することは可能ですが、すべてを1行に収めることはできますか?

4

3 に答える 3

8

$|次のようにゼロ以外の値を設定することで、ファイル ハンドルの自動フラッシュを有効にできます。

local $| = 1;

したがって、完全なスクリプトは次のようになります。

#!/usr/bin/perl

use strict;
use warnings;

local $| = 1;

print "Sleeping... ";
sleep(1);
print "done";

$|に設定することで、これをオフに戻すことができます0。これは、より大きなスクリプトのほんの一部である場合に行う必要があります。理由により、出力はデフォルトでバッファリングされます。

于 2012-08-23T15:45:21.737 に答える
0

代替案:

select()->autoflush();   # Same as:  $| = 1;
print "Sleeping... ";
sleep(1);
print "done\n";

print "Sleeping... ";
select()->flush();       # Same as:  my $saved = $|; $| = 1; $| = $saved;
sleep(1);
print "done\n";

select()(他に使用しSTDOUTない場合は、に置き換えることができますselect()。)

于 2012-08-23T18:27:07.877 に答える
0

使用する

$| = 1

バッファリングされた出力を無効にします。その後、スクリプトは期待どおりに機能します。

于 2012-08-23T15:47:55.117 に答える