【发布时间】:2011-09-06 17:29:02
【问题描述】:
我试图在 perl 中使用 grep,但我必须从 perl 接收参数才能将它们与 grep 选项一起使用,我正在这样做
#!/usr/bin/perl
system(grep -c $ARGV[0] $ARGV[1]);
这会报错,这怎么实现?
【问题讨论】:
-
alias grepc='grep -c $@'in.bashrc
我试图在 perl 中使用 grep,但我必须从 perl 接收参数才能将它们与 grep 选项一起使用,我正在这样做
#!/usr/bin/perl
system(grep -c $ARGV[0] $ARGV[1]);
这会报错,这怎么实现?
【问题讨论】:
alias grepc='grep -c $@' in .bashrc
system('grep', '-c', $ARGV[0], $ARGV[1]);
但请考虑这是否是您想要做的。 Perl 可以自己做很多事情,而无需调用外部程序。
【讨论】:
system() 的参数必须是字符串(或字符串列表)。试试:
#!/usr/bin/perl
system("grep -c $ARGV[0] $ARGV[1]");
【讨论】:
'; rm -rf $HOME' 的第一个参数调用您的脚本的可能性。除非脚本以额外的权限运行(用户可以直接运行rm -rf $HOME),否则这并不是真正的问题,但值得考虑。如果您需要调用 shell 来为您执行命令,则单字符串形式很有用;例如,system("command1 | command2") 可以在 Perl 中完成,但工作量很大。 perldoc -f system
script.pl "Can't" file这样更简单的东西也会失败
您可能无法从该代码中得到您期望的结果。来自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";
【讨论】: