这是我的代码
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
我做错了什么?
答案 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)
这应该快得多,因为你是
diff
一次,而不是两次grep
,wc
或将管道结果传递给shell的算术表达式的命令替换来消除多个不必要的进程。如果你真的想要保留shell,你可以将wc -l
命令放到-c
grep
选项,而{{1}}生成一个行数,而不是实际的线。