我正在看Perl中的一些舊代碼,其中作者在第一行中具有書寫器 $| = 1
。
但是,該代碼沒有任何打印語句,它使用system
命令調用C++二進制文件。現在我讀到$|
將在每次打印後強制刷新。所以它會以任何方式影響系統命令的輸出,或者我可以安全地刪除該行。
感謝 阿文德
我正在看Perl中的一些舊代碼,其中作者在第一行中具有書寫器 $| = 1
。
但是,該代碼沒有任何打印語句,它使用system
命令調用C++二進制文件。現在我讀到$|
將在每次打印後強制刷新。所以它會以任何方式影響系統命令的輸出,或者我可以安全地刪除該行。
感謝 阿文德
我不這麼認爲。 $ |會影響Perl運行的方式,而不是任何外部可執行文件。
您應該安全地將其刪除。
perldoc - perlvar:States「如果設置爲非零,則在當前選擇的輸出通道上每次寫入或打印後立即強制刷新一次」。我認爲這裏重要的是「當前選擇的輸出通道」。外部應用程序將擁有自己的輸出通道。
像這樣的問題往往是容易寫一個簡單的程序,顯示的行爲是什麼:
#!/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
運行。
這是你可以輕鬆檢查自己的東西。創建一個緩衝區的程序,如打印一系列點。你應該在十秒鐘後一下子看到輸出,因爲輸出緩衝:
#!perl foreach (1 .. 10) { print "."; sleep 1; } print "\n";
現在,嘗試設置$|
,並呼籲這跟system
:
% perl -e "$|++; system(qq|$^X test.pl|)";
對於我的測試情況下,$ |值不會影響子進程中的緩衝。