2010-08-04 61 views
2

輸出我有這樣的代碼如下:

$cmd = system ("p4 change -o 3456789"); 

我想打印的變化列表的輸出-description - 到一個文件中。

$cmd = system ("p4 change -o 3456789 > output_cl.txt"); 

會將輸出寫入到output_cl.txt文件中。

但是,有無論如何通過$cmd得到輸出?

open(OUTPUT, ">$output_cl.txt") || die "Wrong Filename"; 
print OUTPUT ("$cmd"); 

會將0或1寫入文件。如何從$cmd獲得輸出?

+2

你的問題是混亂的。你想要輸出原始命令「p4 change -o 3456789」嗎?還是想要別的東西?如果你想要原始命令的輸出,不要使用'system'。相反,使用反引號。 – sholsapp 2010-08-04 18:42:10

回答

2

要將p4命令的輸出存入一個數組,使用qx

my @lines = qx(p4 change -o 3456789); 
1

您可以隨時使用以下過程來轉儲直接輸出到文件中。

1)DUP系統STDOUT文件描述符,2)open STDOUT,3)系統,4)複製IO插槽回STDOUT

open(my $save_stdout, '>&1');    # dup the file 
open(STDOUT, '>', '/path/to/output/glop'); # open STDOUT 
system(qw<cmd.exe /C dir>);    # system (on windows) 
*::STDOUT = $save_stdout;     # overwrite STDOUT{IO} 
print "Back to STDOUT!";      # this should show up in output 

qx//可能是你在找什麼。

參考:perlopentut


當然,這可以概括:

sub command_to_file { 
    my $arg = shift; 
    my ($command, $rdir, $file) = $arg =~ /(.*?)\s*(>{1,2})\s*([^>]+)$/; 
    unless ($command) { 
     $command = $arg; 
     $arg  = shift; 
     ($rdir, $file) = $arg =~ /\s*(>{1,2})\s*([^>]*)$/; 
     if (!$rdir) { 
      ($rdir, $file) = ('>', $arg); 
     } 
     elsif (!$file) { 
      $file = shift; 
     } 
    } 
    open(my $save_stdout, '>&1'); 
    open(STDOUT, $rdir, $file); 
    print $command, "\n\n"; 
    system(split /\s+/, $command); 
    *::STDOUT = $save_stdout; 
    return; 
} 
1

如果你覺得困惑記住,你需要爲了得到一個命令的返回值運行什麼,對它的輸出,或者如何處理不同的返回碼,或者忘記將結果碼右移,你需要IPC::System::Simple,這使得所有這些都很簡單:

use IPC::System::Simple qw(system systemx capture capturex); 

my $change_num = 3456789; 
my $output = capture(qw(p4 change -o), $change_num); 
2

除了用qx// or backticks抓取命令的全部輸出外,還可以獲得命令輸出的句柄。例如

open my $p4, "-|", "p4 change -o 3456789" 
    or die "$0: open p4: $!"; 

現在你可以一次讀取$p4一條線,可能操縱它作爲

while (<$p4>) { 
    print OUTPUT lc($_); # no shouting please! 
}