2011-11-22 29 views
2

使用單個標量參數在具有多個管道的Perl腳本中調用system()。呼叫看上去或多或少是這樣的:以Perl中的單個標量參數調用system()調用的退出代碼

system("zcat /foo.gz | grep '^.{6}X|Y|Z' | awk '{print $2,$3,$4,$6}' | bzip2 > /foo.processed.bz2"); 

問題(foo.gz)文件是相當大的,大約2GB的壓縮。我想這就是爲什麼它最初是通過系統調用完成的。

問題:

現在的問題是,這個系統調用似乎總是返回0,系統命令中的一個是否失效。我認爲這是因爲它通過sh -c '...'被調用。那是對的嗎?

如果只傳遞一個標量參數,是否有方法檢查system()調用是否成功?

有沒有更好的方式來處理這樣一個大文件,其方式相同或更高效(主要是速度方面)?

感謝您提供任何提示,因爲我對Perl並不熟悉。

+2

如果你在perl中通過系統調用使用grep ...你不是用perl編程:) –

+0

我知道,這是一些由別人編寫的舊Perl代碼,我也沒有真正體驗過它,什麼是組合:)無論如何,也許你給了我一些想法如何更好地以更優雅的方式做到這一點? – Haes

+2

另外$ 2,$ 3部分引用變量在Perl代碼中,而不是在awk代碼中。因爲雙引號。 – XoR

回答

3

兩件事情:

  1. 當你做一個系統調用,返回的值是管道中的最後一個值。因此,您將獲得bzip2命令的狀態碼。
  2. 程序執行此操作的原因是編寫程序的人可能不知道更好。我見過Perl程序使用系統調用來查找文件的基本名稱,執行查找,甚至執行復制/重命名/移動。這些都是在Perl程序中可以更快,更容易完成的事情。而且,您沒有整個Windows/Unix兼容性問題。

對於像這樣的事情,你總是使用Perl模塊更好。在這種情況下,我敢打賭,Perl模塊將比shell管道更快,並且您將對整個操作有更多的控制權。

有一組名爲IO::Compress,可以處理Zip和BZip2。

我使用Archive::Zip這是一個很棒的模塊,但是您想使用Bzip2壓縮算法,而Archive::Zip無法處理這個問題。

+0

感謝您對模塊的建議,我會看看他們。 – Haes

+0

你的意思是說'不能處理'? – TLP

+0

@TLP - 是的,你是正確的存檔:: Zip **不能**處理[bzip2壓縮] –

-1

你會更好地Perl本身內做文本處理 - 這就是Perl的對:)

系統()永遠只返回0或1要捕獲實際輸出,嘗試通過反勾調用它:`命令'而不是系統('命令')

+1

這實際上是不準確的。 「返回值是等待調用返回的程序的退出狀態,要獲得實際的退出值,請右移8位[...]返回值-1表示無法啓動程序或錯誤等待(2)系統調用[...]「。 – MetaEd

2

system()返回/bin/sh shell返回的內容。當多個命令是流水線時,shell會爲每個命令分配一個新進程,並返回鏈中最後一個命令的狀態碼,在這種情況下爲bzip2

+0

關於退出代碼的好解釋,非常感謝。 – Haes

1

根據您的意見和答案,我會那樣做,現在:

$infile =~ s/(.*\.gz)\s*$/gzip -dc < $1|/; 
open(OUTFH, "| /bin/bzip > $outfile") or die "Can't open $outfile: $!"; 
open(INFH, $infile) or die "Can't open $infile: $!"; 
while (my $line = <INFH>) { 
    if ($line =~ /^.{6}X|Y|Z) { 
     # TODO: the awk part... 
     print OUTFH $line; 
    } 
} 
close(INFH); 
close(OUTFH); 

請隨意評論和投票向上/向下。

+0

awk行可以在線分割,如:「my @fields = split(/ \ s + /,$線);」。這應該如何awk它,它與IFS變量分裂,這是足夠接近,我想:)。另外,使用變量而不是BIG LETTER thingy更好,我忘記了它們是如何被調用的,例如:'打開我的$ out_fh,「|/bin/bzip> $ outfile」或者死掉$ !;'。看看[perl101](http://perl101.org/files.html)。 – XoR

+1

'打開我的$ infh,' - ','/ bin/zcat',$ infile或者$!''也許是個好主意。 – TLP

相關問題