當在Perl的命令行上執行命令時,有沒有辦法將結果作爲變量存儲在Perl中?爲什麼我不能在Perl中使用system()獲得命令的輸出?
my $command = "cat $input_file | uniq -d | wc -l";
my $result = system($command);
$result
總是被證明是0
當在Perl的命令行上執行命令時,有沒有辦法將結果作爲變量存儲在Perl中?爲什麼我不能在Perl中使用system()獲得命令的輸出?
my $command = "cat $input_file | uniq -d | wc -l";
my $result = system($command);
$result
總是被證明是0
可以使用的Perl背蜱運行shell命令,並將結果保存在數組中。
my @results = `$command`;
要得到shell命令只是一個結果,你可以將其存儲在一個標量:
my $result = `$command`;
如果你期望的輸出回多條線路,它更容易使用數組,但如果你只是期待回到一行,最好使用標量。
(類似的東西,我的Perl是生鏽)
使用 「反引號」:
my $command = "cat $input_file | uniq -d | wc -l";
my $result = `$command`;
如果有興趣的退出代碼,你可以捕捉它:
my $retcode = $?;
在進行外部通話之後。
我假設這是一個「人爲」的例子,因爲這是 等價物:'uniq -d $ input_file | wc -l'。
在幾乎所有的經驗中,將結果 置入perl變量的唯一原因是解析後者。在這種情況下,我用 以下模式:
$last = undef;
$lc = 0;
open(FN, "$input_file");
while (<FN>) {
# any other parsing of the current line
$lc++ if ($last eq $_);
$last = $_;
}
close(FN);
print "$lc\n";
這也有增加的優點:
open()或死($!); – 2009-09-03 23:33:34
從perlfaq8:
爲什麼我不能用system()得到命令的輸出?
你在混淆system()
和反引號(````)的用途。 system()
運行一個命令並返回退出狀態信息(作爲一個16位值:低7位是進程死亡的信號,如果有的話,高8位是實際的退出值)。反引號(``)運行命令並返回它發送到STDOUT的內容。
$exit_status = system("mail-users");
$output_string = `ls`;
您可以按照其他人的建議使用反引號。如果你信任你用來構建命令的變量,那很好。
爲了獲得更大的靈活性,您可以使用open
命令作爲管道並從中讀取文件。當你想將變量作爲命令行參數傳遞給程序並且你不相信它們的源代碼沒有shell轉義字符時,這是特別有用的,因爲近期Perl(> = 5.8)中的open
能夠調用程序從一個參數列表。所以,你可以做到以下幾點:
open(FILEHANDLE, '-|', 'uniq', 'some-file.txt') or die "Cannot fork: $!\n";
while (<FILEHANDLE>) {
# process a line from $_
}
close FILEHANDLE or die "child error: $!\n";
IPC ::系統::簡單的提供了「捕捉」命令,它提供了一個安全,可移植的替代反引號。它(和來自這個模塊的其他命令)是強烈推薦的。
感謝您指出該模塊。 – 2009-09-04 16:25:44
強烈地想要用rtfm來代替它。必須...抵制...諷刺... – 2009-09-04 16:23:36