加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

强制Perl在以exec()结尾时调用END子例程?

发布时间:2020-12-16 06:11:22 所属栏目:大数据 来源:网络整理
导读:在Perl中使用 exec()时: Note that exec will not call your END blocks,nor will it invoke DESTROY methods on your objects. 如何强制perl调用END块?我可以做一些像END(); exec($0)还是其他什么? 我真的想让程序结束它的当前实例并启动一个全新的实例,
在Perl中使用 exec()时:

Note that exec will not call your END blocks,nor will it invoke DESTROY methods on your objects.

如何强制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( ... );
}

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读