3

stdin からの入力、または .log と .log.gz ファイルの混合からの入力を期待するプログラムがあります。プログラムで処理する 3 つのタイプの呼び出しを次に示します。

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

プログラムは、すべての入力ファイルを 1 つと見なします。すべての入力を均一に処理するために 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 に答える