2009-06-22 91 views
4

我正在看Perl中的一些舊代碼,其中作者在第一行中具有書寫器 $| = 1

但是,該代碼沒有任何打印語句,它使用system命令調用C++二進制文件。現在我讀到$|將在每次打印後強制刷新。所以它會以任何方式影響系統命令的輸出,或者我可以安全地刪除該行。

感謝 阿文德

回答

7

我不這麼認爲。 $ |會影響Perl運行的方式,而不是任何外部可執行文件。

您應該安全地將其刪除。

perldoc - perlvar:States「如果設置爲非零,則在當前選擇的輸出通道上每次寫入或打印後立即強制刷新一次」。我認爲這裏重要的是「當前選擇的輸出通道」。外部應用程序將擁有自己的輸出通道。

5

像這樣的問題往往是容易寫一個簡單的程序,顯示的行爲是什麼:

#!/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運行。

5

這是你可以輕鬆檢查自己的東西。創建一個緩衝區的程序,如打印一系列點。你應該在十秒鐘後一下子看到輸出,因爲輸出緩衝:

 
#!perl 

foreach (1 .. 10) 
    { 
    print "."; 
    sleep 1; 
    } 

print "\n"; 

現在,嘗試設置$|,並呼籲這跟system

% perl -e "$|++; system(qq|$^X test.pl|)"; 

對於我的測試情況下,$ |值不會影響子進程中的緩衝。