著者が
$| = 1
最初の行に書いた Perl の古いコードを見ています。
ただし、コードには print ステートメントがなく、system
コマンドを使用して C++ バイナリを呼び出します。今、私はそれ$|
がすべての印刷後に強制的にフラッシュされることを読みました。それで、システムコマンドの出力に何らかの影響を与えますか、それともその行を削除しても安全ですか。
ありがとうアービンド
私はそうは思いません。$| 外部実行可能ファイルではなく、Perl の実行方法に影響します。
安全に削除できるはずです。
perldoc - perlvar : 「0 以外に設定すると、現在選択されている出力チャネルで書き込みまたは印刷を行うたびに、すぐに強制的にフラッシュします。」. ここで重要なのは「現在選択されている出力チャンネル」だと思います。外部アプリケーションには、独自の出力チャネルがあります。
これは簡単に自分で確認できるものです。一連のドットを印刷するなど、バッファリングが重要なプログラムを作成します。出力がバッファリングされるため、10秒後に出力が一度に表示されます。
#!perl foreach(1 .. 10) {{ 印刷"。"; 睡眠1; } 印刷"\n";
さて、$|
これを設定して呼び出してみてくださいsystem
:
% perl -e "$|++; system( qq|$^X test.pl| )";
私のテストケースでは、$ | 値は子プロセスのバッファリングに影響しませんでした。
このような質問では、動作が何であるかを示す簡単なプログラムを作成するのは簡単です。
#!/usr/bin/perl
use strict;
use warnings;
if (@ARGV) {
output();
exit;
}
print "in the first program without \$|:\n";
output();
$| = 1;
print "in the first program with \$|:\n";
output();
print "in system with \$|\n";
system($^X, $0, 1) == 0
or die "could not run '$^X $0 1' failed\n";
$| = 0;
print "in system without \$|\n";
system($^X, $0, 1) == 0
or die "could not run '$^X $0 1' failed\n";
sub output {
for my $i (1 .. 4) {
print $i;
sleep 1;
}
print "\n";
}
このことから、設定$|
は。を介して実行されるプログラムに影響を与えないことがわかりsystem
ます。