2015-04-12 87 views
0

这是我的代码Perl不评估bash脚本正确

my $shell_line_diff=`echo $(($(diff -U 0 ftest1.txt ftest2.txt|grep ^\+|wc -l)-$(diff -U 0 ftest1.txt ftest2.txt|grep ^\-|wc -l)))`; 
print "difference in the number of lines is $shell_line_diff\n"; 

和评估脚本正常工作在Linux上的bash。

但在Perl它给了我下面的结果:

sh: -c: line 0: syntax error near unexpected token `(' 
sh: -c: line 0: `echo 1010 1010 10000000 10000003 10000004 10000010(1010 1010 10000000 10000003 10000004 10000010diff -U 0 ftest1.txt ftest2.txt|grep ^+|wc -l)-1010 1010 10000000 10000003 10000004 10000010diff -U 0 ftest1.txt ftest2.txt|grep ^-|wc -l)))' 
difference in the number of lines is 

我做了什么错?

+2

你应该有两个开头的括号'('? – ShellFish

+0

你正在推进很多工作,你可以在Perl中直接进行shell的工作。 – chepner

回答

4

这是因为你的shell命令没有被引用。 使用像这样的临时变量:

my $cmd = 'echo $(($(diff -U 0 ftest1.txt ftest2.txt|grep ^\+|wc -l)-$(diff -U 0 ftest1.txt ftest2.txt|grep ^\-|wc -l)))'; 
my $shell_line_diff=`$cmd`; 
print "difference in the number of lines is $shell_line_diff\n"; 

如果不正确地引用它,$(由Perl的解释之前执行的反引号命令(见man perlvar)。

1

忽略与代码中的实际问题,我将简化这

my @lines = qx/diff -U 0 ftest1.txt ftest2.txt/ 
my $shell_line_diff = grep(/^\+/, @lines) - grep(/^-/, @lines) 

这应该是更快,因为你是

  1. 只有运行diff一次,而不是两次
  2. 消除通过不运行grepwc或将流水线结果传递到shell的算术表达式的命令替换来执行几个不必要的进程。

如果你真的想保持外壳,你可以赞成-c选项删除wc -l命令grep,其产生的行数,而不是实际的套系。