Perl 如何将块用作';或';子句而不是简单的模具?

Perl 如何将块用作';或';子句而不是简单的模具?,perl,syntax,codeblocks,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抱

我想检查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"
这是我代码片段中的第二个日志

非常感谢您的建议


干杯,

使用

下面是一段小代码片段:


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

test(3) || do {
            print "another value was sent";
};
这就是你想要的:

$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);
}
如果您只想返回一个错误条件,那么可以在调用func中使用

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();
}

}或do{};总是让我头疼。使用“或”语法(我承认对一行程序使用了很多)和“如果”(我更喜欢多行程序)有什么好的理由吗

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

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

if (!foo()) {
  log($error);
  return($error);
}
log($success);

我很难理解为什么这需要用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。

请确保遵循Axeman的建议,使用“-no_match_vars”;有关详细信息,请参阅。或者,您可以使用$@表示$EVAL\u ERROR,但$EVAL\u ERROR更易于阅读。谢谢,Robert,但我认为我们的修复程序崩溃了。:)我将使用除非(foo()){而不是if(!foo())。当函数调用跨越许多行,如DBI->connect('DBI:foo:dbname=bar',$user,$pass,{AutoCommit=>0,chopbanks=>1,})或{#handle error}或“or do”时,我将使用or do{}当post语句用于错误检查时,它是我首选的方式。它按预期显示实际操作,然后附加一些额外的内容来处理错误。“除非”(和“如果”)过多地强调错误处理,就好像生成错误是故意的。因此答案似乎是因为一种方法更有意义或看起来更好(我明白当操作跨越多行时使用或执行{}的意义,但我不相信“过多地强调错误处理”逻辑).最终,这两个答案都与美学有关,而不是与性能有关…对,这里没有什么关于性能的信息。如果你在这个级别上看性能,你就错了。do{..}以更具可读性的方式对事物进行分组。不带括号或块的条件串在一起会让你停下来想一想到底发生了什么(并想知道“嗯,log()能返回false吗?”)。假设log()返回true。更好:或log(“…”),返回-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;