14

我想检查 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"

这是我的代码片段中的第二个日志。

任何建议都非常感谢。

干杯,

4

4 回答 4

30

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使用。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" );

}

于 2009-03-20T16:53:14.003 回答
4

或做{};总是让我头疼。是否有充分的理由使用“或”语法(我承认在一个衬里使用了很多)与“if”(我更喜欢在多衬里使用)?

那么,是否有理由使用或不使用其中一种方法而不是另一种?

foo()
  or do {
    log($error);
    return($error);
  };
log($success);

if (!foo()) {
  log($error);
  return($error);
}
log($success);
于 2009-03-20T17:05:13.990 回答
1

使用

这是小代码片段:


sub test {
    my $val = shift;
    if($val != 2) {
        return undef;
    }
    return 1;
}

test(3) || do {
            print "another value was sent";
};
于 2009-03-20T16:52:07.860 回答
-1

我很难理解为什么这需要包含在一个 do 中。有理由说这还不够吗?

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。

于 2009-03-20T19:28:37.423 回答