Как использовать блок как предложение "или" вместо простой матрицы?

Я хочу проверить результаты операции в модуле Net:: FTP Perl, а не умереть.

Обычно вы делаете:

$ftp->put($my_file)
  or die "Couldn't upload file";

Но я хочу сделать что-то другое вместо того, чтобы просто умереть в этом script, поэтому я попробовал:

$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"

который является вторым log в моем фрагменте кода.

Любые предложения, которые были высоко оценены.

веселит,

Ответ 1

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 в вызывающем func.

use English qw<$EVAL_ERROR>; # Thus, [email protected] <-> $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

или do {}; всегда у меня болит голова. Есть ли веская причина использовать "или" синтаксис (который я допускаю, используя много для одного лайнера) против "if" (что я предпочитаю для нескольких лайнеров)?

Итак, есть ли причина использовать или не использовать один из этих методов в предпочтении другого?

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

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

Ответ 3

используйте сделать.

здесь небольшой фрагмент кода:


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

test(3) || do {
            print "another value was sent";
};

Ответ 4

Мне сложно понять, почему это нужно обернуть в делах. Есть ли причина, что этого недостаточно?

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 при успешном завершении.