Как использовать блок как предложение "или" вместо простой матрицы?
Я хочу проверить результаты операции в модуле 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 при успешном завершении.