Как использовать блок в качестве предложения 'или' вместо простого кубика? - PullRequest
13 голосов
/ 20 марта 2009

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

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

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

29 голосов
/ 20 марта 2009

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

}

4 голосов
/ 20 марта 2009

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

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

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

if (!foo()) {
  log($error);
  return($error);
}
log($success);
1 голос
/ 20 марта 2009

использовать до .

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


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

test(3) || do {
            print "another value was sent";
};
0 голосов
/ 20 марта 2009

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

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 в случае успеха.

...