1

ダイを使ってクリーンアップする方法はないかと思っていました。たとえば、いくつかのファイルを作成したが、プログラムが停止する必要がある状況に陥った場合は、それらを削除したい場合です。

ありがとう

4

4 に答える 4

9

ENDdieブロックは、プログラムが sであっても実行されます。

use File::Temp qw( tempfile );

# create "things"
my ($fh, $filename) = tempfile();

# die because of a problem
die ('a problem occured');

# clean up when dying
END { unlink $filename; }

通常の終了時にのみ何かを実行したい場合はdie、使用できます%SIG-ハンドラーが通常の動作を置き換えるdieことに注意してください。これは、自分で呼び出す必要があります。

$SIG{__DIE__} = sub {
    unlink $filename;
    CORE::die @_;
}
于 2012-11-08T13:35:47.457 に答える
5

おそらく END ブロックを探しているでしょう ( perlsubを参照)。ただし、そのテーマには他にも多くのバリエーションがあります。たとえば、Guardは、クリーンアップがスコープを終了することを許可します (return、die、goto のいずれによる場合でも)。または、単純に DESTROY メソッドを使用して独自のオブジェクトを作成し、その DESTROY メソッドにクリーンアップを貼り付けます。

この特定のケースでは、File::Remove ::clean にも関心があるかもしれません。これはテスト ファイルを対象としていますが、この特定の問題も解決する可能性があります。

于 2012-11-08T13:39:08.593 に答える
1

このテーマの別のバリエーションは、次のようなtry/finallyブロックですTry::Tiny

use Try::Tiny;

my ($fh, $filename) = tempfile();
try {
    some code here...;
}
finally {
    unlink $filename;
};
于 2012-11-08T14:32:04.673 に答える