gpt4 book ai didi

perl - 使用 `$@` 的错误处理

转载 作者:行者123 更新时间:2023-12-03 07:38:41 25 4
gpt4 key购买 nike

我的目标是检查几个输入文件(file1file2)的关键字(key1key2 ,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;

与文件 1:

key1    11
key2 22
key3 33

和文件2:

key1    11
key2 AB
key3 33

如果没有 eval block ,程序将按预期运行:如果例如file2 丢失,发生错误,Perl 退出。使用 eval - block 进行正确的匹配,我只得到 !!! Error for keyword 表示输入文件特定行的错误(如果输入文件完全丢失,我会得到每一行的错误)。但是我不能使用 $@。这会为每一行创建错误。

我也尝试过在没有 die 的情况下使用 closeopen,但这都不起作用。

感谢任何帮助!

最佳答案

问题是您在 eval block 中返回值。

就像子程序一样,eval 的返回值是里面最后一行的值,或者是你在最后一行之前使用return 返回的值。因此,如果您在 eval block 中返回值,您会将其传递给 parse 子例程,但不会将其返回给 out 子例程.这就是为什么 $ok 总是 undef 的原因。

考虑这段代码:

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 子例程的值。

关于perl - 使用 `$@` 的错误处理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19000167/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com