2012-11-02 64 views
3

我有一個程序,希望從stdin輸入,或者從.log和.log.gz文件混合輸入。下面是三種類型的呼叫我想要的程序來處理:如何統一處理輸入文件

cat input.log | prog 
prog < input.log 
prog input.log input.log.gz 

該方案認爲所有的輸入文件爲一體。我希望能利用ARGV均勻處理所有輸入:

while (<>) { 
# process input 
} 

我的目標是在處理同一迴路GZ文件。如何才能做到這一點?我想知道它有多混亂。如果太糟糕,我會分開處理gz。

我只能在Perl 5.8.8中使用核心模塊。

+2

可憐呀..這些限制削弱的Perl嚴重。 'IO :: Compress :: Gzip'和'IO :: Uncompress :: Gunzip'是5.9.4以來的核心。如果沒有任何CPAN模塊的話,會有什麼原因可以讓你找到一個古老的Perl解釋器? –

+0

我不會考慮嘗試處理沒有模塊支持的gzip文件。你會被迫'運行'gzip -cd'並閱讀它的輸出'shenanigans;只是讓調用者處理解壓縮更簡單。 –

+0

不喜歡這個要求,抱怨,但現在我無法控制它。所有的希望都不會丟失,但這是另一個話題! –

回答

1

你無法真正做到這一點,並獲得鑽石操作員的速記優勢。

  • 因爲你將不得不用猴子輸入句柄,你將需要open自己的文件。
  • 您可能能夠使用@ARGV這一點,但如果你重新打開*::STDIN這些文件,你會只得到了易於操作。

    my $file = shift; 
    if (!$file)   {} # use STDIN as is. 
    elsif ($file =~ /\.gz$/) { 
        open(::STDIN, '-|', "gunzip $file") or die "Could not open: $!!"; 
    } 
    else { 
        open(::STDIN, '<', $file) or die "Could not open $file: $!!"; 
    } 
    
    while (<>) { 
        ... 
    } 
    close STDIN; 
    
+0

我讀這個錯嗎?它看起來像gunzip是在錯誤的其他塊。 – mattc

+0

@mattc:是的,你是。假設文件以gzip後綴結尾,需要使用'gunzip'。 – titanofold

+0

哈哈,看起來它已被糾正,因爲我評論。 – mattc