如何使用块作为'或'子句而不是简单的死?

时间:2009-03-20 16:50:12

标签: perl syntax codeblocks

我想检查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 个答案:

答案 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。