3

我有一个程序需要来自标准输入的输入,或者来自 .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 中使用核心模块。

4

1 回答 1

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;
    
于 2012-11-02T15:59:28.537 回答