2011-06-17 37 views
1

我從Need a progress indicator for a Perl system() command using T:R:G mod需要輸出系統()命令的作用,並有進度指示器

open(my $cmd, '-|', "$command $flags_args 2>/dev/null") 
    or print "\nAttention: Command $command $flags_args failed $!" 
    and return 1; 

while (<$cmd>) 
{ 
    $percentage = ($cntr/$lines) * 100; 
    $percentage = 100 if $percentage > 100; 

    printf("Progress: %3d%%\r", $percentage); 
    $cntr++; 

} 
close($cmd); 

一個不錯的進度指示器現在我想我的命令輸出的輸出和錯誤的記錄。我不是太熟悉的管道輸出,所以我嘗試添加:

print $LOG $cmd 

print $LOG Dumper(\$cmd) 

while循環結束之前。它不起作用。第一輸出

GLOB(0x11df7a0)GLOB(0x11df7a0)GLOB(0x11df7a0) 

第二

$VAR1 = \\*{'::$cmd'}; 
$VAR1 = \\*{'::$cmd'}; 
$VAR1 = \\*{'::$cmd'}; 

有誰知道我怎麼可以從管道$ CMD輸出? 實例爲$命令= make命令

Making all in src 
make[1]: Entering directory `/tmp' 
Making all in include 
make[2]: Entering directory '/tmp/2' 

... 

回答

4

嘗試使它

print $LOG $_; 

或者只是

print $LOG; 

(因爲$_是,如果沒有指定默認值)

解釋:$cmd是你正在閱讀的文件g來自; $_是從它讀取的行。你可以更清楚通過寫

while ($line = <$cmd>) { 
    print $LOG $line; 
    ... 
} 
+0

感謝。 – bitbucket

+1

使用'while(my $ line = ...)' – friedo

+0

@friedo:當然你是對的,那更好 - 我只是不想把這個問題與太多的變化混淆在一起:) – psmears

2

$cmd是I/O處理你的命令的輸出,內部數據類型,它沒有太大的意義進行打印。你想用<$cmd>readline($cmd)得到它的輸出,你已經做你while循環:for unconfusing我

while (<$cmd>)  # same as: while (defined($_ = readline($cmd))) 
{ 
    # last line from command is now stored in $_ 
    print $LOG $_; 

    $percentage = ($cntr/$lines) * 100; 
    $percentage = 100 if $percentage > 100; 

    printf("Progress: %3d%%\r", $percentage); 
    $cntr++; 


} 
+0

有趣的「命令的最後一行不存儲在$ _ 」 – bitbucket

+0

Gads!這應該是「命令的最後一行是**現在**存儲在$ _」 – mob