9

ほとんどの場合、私は次のようなことをします。

open FH, ">file.txt" or die "Cann't open file: $!";

die使用する必要がありますか?スクリプトを続行したい場合 (ファイルを開けない場合はエラーを無視したい場合)、どうすればよいですか?

4

9 に答える 9

22

You might want to do something like

if(open my $fh, ">", "file.txt") {
    # do stuff with file
    close $fh;
}
else {
    # do stuff without file
} 
于 2013-06-25T20:11:51.823 に答える
0

数か月前の質問に回答して申し訳ありませんが、これを行う方法は、独自のdieスタイル サブルーチンを実装することです。

sub fail {
    my $text = $_[0];

    # Do error-related stuff here, like send an email
    die($text) # or just exit
}

open(my $fh, ">file.txt") or fail("Unable to open file: $!");
于 2013-09-12T15:30:53.457 に答える
-1

Try::Tiny などを使用して、try catch ブロックを使用できます。

于 2013-06-25T20:06:55.170 に答える
-1

ファイルを開くときにエラーが発生したときにプログラムを終了しないようにすることを目的としている場合、 を省略することdieは正しい方法ではありません。 diePerl の例外メカニズムです。デフォルトでプログラムを中止するという事実は、基本的ではなく偶発的な特性です。例外ハンドラを指定すると、制御を保持できます。正しいアプローチは、例外をキャッチし、finallyブロックでクリーンアップを行うことです。

use 5.10.0;
use Try::Tiny;

my ($infile, $FH);
try {
    open $infile, '<', 'infile.txt' or die "Can't open infile";
    try { 
        open $FH, '>', 'file.txt'   or die "Can't open outfile";
        my $line = <$infile>;
        print $FH $line;
        say 'Cleaning up $FH';
        close $FH;
    } finally {
        say 'Cleaning up $infile';
        close $infile;
    } catch {
        die $_;
    };
} catch {
    die $_;
};

したがって、open $infile ...失敗した場合は、スクリプトを再実行して中止するブロックに移動しますdiecatchしかし、一度開い$infileて失敗した場合open $FHは、プログラムを中止するが強制的close $infileに最初に発生させる catch ブロックに死ぬ。ファイル ハンドルは、インタープリターがファイルを自動的に閉じるため、プログラムの終了前にクリーンアップするリソースの最適な例ではありませんが、基本的な考え方はそこにあります。

ネストされたブロックが気に入らない場合はtry、どの例外がブロックを中止させたかを確認し、それに基づいてどのようなクリーンアップが必要かを判断することで、非常によく似た効果を得ることができます。それはもう少し壊れやすいですが、言及されている何よりも堅牢ですgoto

于 2013-06-27T23:10:50.503 に答える