如何统一处理输入文件

时间:2012-11-02 15:12:55

标签: perl

我有一个程序期望来自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的核心模块。

1 个答案:

答案 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;