由此推斷,你在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