由此推断,你在shell命令行中运行的命令是:
tshark –r input.dump -V |
egrep "Source:|Destination:|Time since reference or first frame:|Source port:|Destination port:" |
grep –v "Vmware" >input.useful
运行在Perl的“相同”命令的最简单方法是来包装逐字逐句,使用非常有用的qq{}
表示法选择双引号作为"
以外的内容。或者,确实要将其包含在单引号中,甚至可能包含q{}
。
my $cmd = q{
tshark –r input.dump -V |
egrep "Source:|Destination:|Time since reference or first frame:|Source port:|Destination port:" |
grep –v "Vmware" >input.useful
};
现在你能够运行与system
:
system $cmd;
我想你的建议,我得到确切同样的错误了。
很奇怪。我想这一点,这是接近你的榜样,以同构:
#!/usr/bin/env perl
use strict;
use warnings;
my $cmd = q{
ls -l |
egrep "merge|sort" |
grep -v 'cpp$' > list.out
};
system $cmd;
而且其运行没有任何错误,产生list.out
文件:
-rw-r--r-- 1 jleffler staff 2064 Sep 21 13:54 keysort1.c
-rw-r--r-- 1 jleffler staff 2602 Sep 21 13:54 keysort2.c
-rwxr-xr-x 1 jleffler staff 14488 Sep 21 18:28 merge
-rw-r--r-- 1 jleffler staff 6274 Sep 21 13:54 merge.c
drwxr-xr-x 3 jleffler staff 102 Sep 21 18:28 merge.dSYM
-rw-r--r-- 1 jleffler staff 8633 Sep 21 06:49 mergesort.c
-rwxr-xr-x 1 jleffler staff 26232 Sep 21 18:01 mergesort2
drwxr-xr-x 3 jleffler staff 102 Sep 21 18:01 mergesort2.dSYM
-rw-r--r-- 1 jleffler staff 3335 Sep 21 17:25 msort.c
-rw-r--r-- 1 jleffler staff 16134 Sep 21 06:49 sorttest.c
这是当前正确的输出为我做题目录在'排序合并'分支上。
你可以尝试类似的测试吗?你的外壳($SHELL
)设置为?
你能分阶段建立你的命令吗?
- 通过
system
运行 'tshark -r input.dump -V > input.raw
',看看你会得到什么。
- 运行'
tshark -r input.dump -V | egrep "Source:|Destination:" > input.parboiled
并看看你得到了什么。
- 运行'
cat input.parboiled | grep -v "Vmware" > input.semiuseful
',看看你得到了什么。
等等东西应该把游戏带走。在极端情况下,请尝试在命令前添加set -x;
,以便看到shell认为它正在运行的内容。
如果这就是你正在做的,为什么你需要在等式中使用Perl? – tripleee
因为这是分配。 Perl脚本运行这个部分,然后获取输出并通过C程序运行,该程序对数据做了进一步处理。 – DarthLeia2
但是,你可以只打开(处理,“tshark |”)'并在Perl中执行所有复杂的grepping操作,而不是写入文件。 – tripleee