perl没有正确评估bash脚本

时间:2015-04-12 05:41:51

标签: linux bash perl

这是我的代码

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 个答案:

答案 0 :(得分: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 :(得分:1)

忽略代码的实际问题,我会将其简化为

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

这应该快得多,因为你是

  1. 仅运行diff一次,而不是两次
  2. 通过不运行grepwc或将管道结果传递给shell的算术表达式的命令替换来消除多个不必要的进程。
  3. 如果你真的想要保留shell,你可以将wc -l命令放到-c grep选项,而{{1}}生成一个行数,而不是实际的线。