14

死ぬのではなく、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"

これは私のコード フラグメントの 2 番目のログです。

どんな提案でも大歓迎です。

乾杯、

4

4 に答える 4

30

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

}

于 2009-03-20T16:53:14.003 に答える
4

または{}; いつも頭が痛くなります。「または」構文 (1 つのライナーに多くの使用を認めている) と「if」(複数のライナーに適している) を使用する正当な理由はありますか?

では、これらの方法のいずれかを優先して使用する、または使用しない理由はありますか?

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

if (!foo()) {
  log($error);
  return($error);
}
log($success);
于 2009-03-20T17:05:13.990 に答える
1

使用しております

ここに小さなコードスニペットがあります:


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

test(3) || do {
            print "another value was sent";
};
于 2009-03-20T16:52:07.860 に答える
-1

これを 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 を返すとは限らないことを前提としています。

于 2009-03-20T19:28:37.423 に答える