2011-09-06 166 views
1

我嘗試用Perl使用grep,但我必須recive從Perl的參數使用grep選擇用它們,我這樣做如何從perl腳本參數傳遞給bash腳本

#!/usr/bin/perl 
system(grep -c $ARGV[0] $ARGV[1]); 

,這將引發一個錯誤,這怎麼可以實施?

+1

'別名grepc = 'grep的-c $ @'''在.bashrc' – ikegami

回答

7
system('grep', '-c', $ARGV[0], $ARGV[1]); 

但請考慮這是否是你想要做的。 Perl可以在不調用外部程序的情況下自行完成很多事情。

+1

見http://stackoverflow.com/questions/3477916/using-perls-system/3478060#3478060進行錯誤處理。 – daxim

0

system()的參數必須是字符串(或字符串列表)。請嘗試:

#!/usr/bin/perl 
system("grep -c $ARGV[0] $ARGV[1]"); 
+2

列表形式更安全。考慮有人用''的第一個參數調用你的腳本的可能性; rm -rf $ HOME''。這不是真正的問題,除非腳本以額外的權限運行(用戶可以直接運行'rm -rf $ HOME'),但值得考慮。如果您需要調用shell爲您執行命令,則單字符串表單很有用;例如'system(「command1 | command2」)'*可以在Perl中完成,但是它有很多工作。 'perldoc -f系統' –

+1

它也失敗了像'script.pl「這樣簡單的東西不能」文件「 – ikegami

0

您可能不會從該代碼中得到您所期望的。從perldoc -f system

The return value is the exit status of the program as returned by 
the "wait" call. 

system實際上不會給你數從grep,剛剛從grep的過程的返回值。

要能夠使用perl中的值,請使用qx()或反引號。例如。

my $count = `grep -c ... `; 
# or 
my $count2 = qx(grep -c ...); 

請注意,這會在數字後出現換行符,例如: 「6 \ n」 個。

但是,爲什麼不使用所有perl?

my $search = shift; 
my $count; 
/$search/ and $count++ while (<>); 
say "Count is $count"; 

由鑽石操作<>執行可以在不法分子手中的危險,但隱含open。你不是可以手動打開文件用三個參數的open:

use autodie; 
my ($search, $file) = @ARGV; 
my $count; 
open my $fh, '<', $file; 
/$search/ and $count++ while (<$fh>); 
say "Count is $count";