强制Perl在以exec()结尾时调用END子例程?
在Perl中使用
exec()时:
如何强制perl调用END块?我可以做一些像END(); exec($0)还是其他什么? 我真的想让程序结束它的当前实例并启动一个全新的实例,而且我懒得正确地执行此操作(使用cron或将整个程序置于无限循环中).但是,我的END子程序清理临时文件和其他重要的东西,所以我需要它们在执行之间运行. 无益的代码链接: https://github.com/barrycarter/bcapps/blob/master/bc-metar-db.pl https://github.com/barrycarter/bcapps/blob/master/bc-voronoi-temperature.pl https://github.com/barrycarter/bcapps/blob/master/bc-delaunay-temperature.pl 解决方法
要回答如何在任意时间调用END块的狭隘问题,可以使用带有B :: SV :: object_2svref的
B::end_av 方法来获取END块的代码引用.
sub invoke_end_blocks_before_exec { use B; my @ENDS = B::end_av->ARRAY; foreach my $END (@ENDS) { $END->object_2svref->(); } } END { print "END BLOCK 1n" } END { print "END BLOCK 2n" } ... invoke_end_blocks_before_exec(); exec("echo leave this program and never come back"); 输出: END BLOCK 2 END BLOCK 1 leave this program and never come back 不过,我通常会喜欢不太神奇的东西.为什么不像一个结构 sub cleanup { ... } END { &cleanup } if (need_to_exec()) { cleanup(); # same thing END was going to do anyway exec( ... ); } ? (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |