1

我想知道是否有任何方法可以使用 die 进行一些清理。例如,如果我创建了一些文件,但如果程序遇到需要终止的情况,我希望将它们删除。

谢谢

4

4 回答 4

9

END即使程序 s.blocks 也会被执行die

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 回答
0

如果这些是临时文件,无论您是否死亡,都希望在完成后删除,请使用File::Temp

于 2013-07-18T16:02:23.090 回答