我想在进行下一步之前验证一个条件,但只提出警告并跳过当前值而不是死亡.
如何在不返回任何值的情况下重写validate_me()子例程?
(更新)请注意,下面的代码按预期工作,它只是我想要其他东西,而不是从validate_me()返回1或0仍然允许代码行为相同.
foreach my $file ( @files ) {
validate_me($foo, $bar, $baz) or next;
do_something();
}
sub validate_me {
my ($foo, $bar) = @_;
if ( $foo > $bar ) {
carp("Something goes awol");
return 0;
}
if ( $bar != $baz ) {
carp("Odd");
return 0;
}
return 1; # success
}
Run Code Online (Sandbox Code Playgroud)
谢谢.
检查文档以获取退货.如果你想什么都不返回,不要给返回一个参数:
return;
Run Code Online (Sandbox Code Playgroud)
更新:
我想要其他东西,而不是从 validate_me() 返回 1 或 0,但仍允许代码表现相同。
你是这个意思吗?看eval。
my @files = qw( a b c d e f );
FILES:
foreach my $file ( @files ) {
eval { validate_me($file) };
if (my $ex = $@) {
warn "'$file' failed validation: $ex";
next FILES;
}
print "$file passed\n";
}
sub validate_me {
my ($file) = @_;
die "Invalid filename\n" if 0.5 > rand;
return; # explicitly return nothing
}
Run Code Online (Sandbox Code Playgroud)
现在,明智的做法是重构validate_me其组件:
for my $file ( @files ) {
if ( is_something_gone_awol($file, $mile) ) {
warn "Something has gone awol: '$file' and '$mile'\n";
}
elsif ( is_something_odd($file, $smile) ) {
warn "Something is odd: '$file' and '$smile'\n";
}
else {
do_something($file);
}
}
sub is_something_gone_awol {
my ($foo, $bar) = 0;
return $foo gt $bar;
}
sub is_something_odd {
my ($bar, $baz) = @_;
return $bar ne $baz;
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
10494 次 |
| 最近记录: |