私の目的は、いくつかの入力ファイル ( file1
、file2
) のキーワード ( key1
、key2
、key3
) をチェックし、数字と一致させることです。エラーが発生した場合、プログラムは停止して次の単語/ファイルをチェックするべきではありません。適切なエラー出力を提供したい。これまでの私のコードは次のとおりです。
#!/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
ません。open
die
どんな助けでも大歓迎です!