3

私の目的は、いくつかの入力ファイル ( file1file2) のキーワード ( key1key2key3) をチェックし、数字と一致させることです。エラーが発生した場合、プログラムは停止して次の単語/ファイルをチェックするべきではありません。適切なエラー出力を提供したい。これまでの私のコードは次のとおりです。

#!/usr/bin/perl
use strict;
use warnings;

foreach ("key1","key2","key3"){output("$_","file1")}
foreach ("key1","key2","key3"){output("$_","file2")}
foreach ("key1","key2","key3"){output("$_","file1")}

sub parse{

my $keyword = shift;
my $path = shift;
my $match;

eval{
        open(FILE,"$path") or die "Cannot open file $path in parse(): $!\n";
        while (my $line = <FILE>) {
                if ($line =~ /^$keyword\s+(\d+)/){ ;
                        $match = $1;
                }
        }
        return (1, $match) if (defined $match);
        return (0)
    };
if ($@){print "!!! Error in parse():\n\t $@\n";}    
}

sub output{

my $keyword = shift;
my $path = shift;
my ($ok, $tmp);

($ok, $tmp) = parse("$keyword", "$path");
print "Value $tmp for keyword: $keyword\n" if $ok;
print "!!! Error for keyword: $keyword\n" if not $ok;

}

1;

file1 を使用:

key1    11
key2    22
key3    33

および file2:

key1    11
key2    AB
key3    33

-block がないとeval、プログラムは期待どおりに実行されます。egfile2が見つからない場合、エラーが発生して Perl が終了します。eval-block を使用すると、正しいマッチングが行われ、!!! のみが取得されます。入力ファイルの特定の行のエラーのキーワードのエラー (入力ファイルがまったく見つからない場合、各行でエラーが発生します)。しかし、私は使用できません$@。これにより、行ごとにエラーが発生します。

も使用しようとしましたが、これも機能しcloseません。opendie

どんな助けでも大歓迎です!

4

1 に答える 1

4

eval問題は、値をブロックで返していることです。

サブルーチンと同様に、 の戻り値はeval内部の最後の行の値、または を使用して最後の行の前に返された値ですreturn。したがって、ブロックで値を返す場合、evalそれをサブルーチンに渡しましたが、parseサブルーチンに返しませんでしたout$okそしてそれが常にある理由ですundef

このコードを検討してください:</p>

my $ret = eval{
        open(FILE,"$path") or die "Cannot open file $path in parse(): $!\n";
        #open(FILE,"$path");
        while (my $line = <FILE>) {
                if ($line =~ /^$keyword\s+(\d+)/){ ;
                        $match = $1;
                }
        }
        return (1) if (defined $match);
        return (0);
        #close(FILE);

};
print "$ret\n";

ファイルが一致する場合は 1 が表示されます。evalただし、ブロックされたものからoutサブルーチンに渡された値を返す必要があります。

于 2013-09-25T09:14:19.357 に答える