代码之家  ›  专栏  ›  技术社区  ›  Rob Wells

如何将块用作“或”子句而不是简单的die?

  •  13
  • Rob Wells  · 技术社区  · 16 年前

    我想检查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 回复  |  直到 9 年前
        1
  •  28
  •   Axeman maxelost    9 年前

    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" );
    

    }

        2
  •  4
  •   jj33    16 年前

    或者总是让我的头受伤。有没有充分的理由使用“或”语法(我承认一行程序使用很多语法)和“if”(我更喜欢多行程序)?

    那么,是否有理由使用或不使用这些方法中的一种而优先使用另一种?

    foo()
      or do {
        log($error);
        return($error);
      };
    log($success);
    
    if (!foo()) {
      log($error);
      return($error);
    }
    log($success);
    
        3
  •  1
  •   Geo    16 年前

    使用 .

    下面是小代码段:

    
    sub test {
        my $val = shift;
        if($val != 2) {
            return undef;
        }
        return 1;
    }
    
    test(3) || do {
                print "another value was sent";
    };
    
        4
  •  -1
  •   Erik Johansen    16 年前

    我很难理解为什么要把这件事归根结底。这还不够吗?

    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。