我想检查Net :: FTP Perl模块中的操作结果而不是死。
通常你会这样做:
$ftp->put($my_file)
or die "Couldn't upload file";
但我想做其他事情,而不是仅仅死在这个剧本中,所以我尝试了:
$ftp->put($my_file)
or {
log("Couldn't upload $my_file");
return(-1);
}
log("$my_file uploaded");
但是Perl抱怨编译错误说:
syntax error at toto.pl line nnn, near "log"
这是我的代码片段中的第二个日志。
任何建议都非常感谢。
欢呼声,
答案 0 :(得分:29)
do
正是您所寻找的:
$ftp->put($my_file)
or do {
log("Couldn't upload $my_file");
return(-1);
};
log("$my_file uploaded");
但是这个可能是更好的风格:
unless( $ftp->put( $my_file )) { # OR if ( !$ftp->put...
log("Couldn't upload $my_file");
return(-1);
}
如果您只想返回错误条件,则可以die
并在调用func中使用eval
。
use English qw<$EVAL_ERROR>; # Thus, $@ <-> $EVAL_ERROR
eval {
put_a_file( $ftp, $file_name );
handle_file_put();
};
if ( $EVAL_ERROR ) {
log( $EVAL_ERROR );
handle_file_not_put();
}
然后致电
sub put_a_file {
my ( $ftp, $my_file ) = @_;
$ftp->put( $my_file ) or die "Couldn't upload $my_file!";
log( "$my_file uploaded" );
}
答案 1 :(得分:4)
或做{};总是让我头疼。是否有充分的理由使用“或”语法(我承认对一个衬垫使用很多)与“if”(我更喜欢多衬里)?
那么,是否有理由使用或不使用其中一种方法而不是另一种?
foo()
or do {
log($error);
return($error);
};
log($success);
if (!foo()) {
log($error);
return($error);
}
log($success);
答案 2 :(得分:1)
使用执行。
这是一个小代码片段:
sub test {
my $val = shift;
if($val != 2) {
return undef;
}
return 1;
}
test(3) || do {
print "another value was sent";
};
答案 3 :(得分:-1)
我很难理解为什么需要把它包裹起来。有没有理由说这还不够?
my $ftp_ok = $ftp->put( $my_file )
or log("Couldn't upload $my_file" ) and return -1;
log("$my_file uploaded") if $ftp_ok;
这假设put函数在成功时并不总是返回undef。