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