2012-11-02 63 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