首页 > 解决方案 > Perl如何在程序完成后删除目录

问题描述

我希望允许用户通过命令行(例如 --clean)传递清理参数以删除包含不再需要的文件的目录。当我尝试执行 remove_tree 时,它​​会在程序运行期间执行。我怎样才能得到它,以便在整个运行完成后执行它,然后删除我不再需要的目录?

所以我有/$cleanup我的getOptions。

if (defined $cleanup){
remove_tree("my path here");
}

这不是如何删除目录的问题,而是如何通过命令行仅根据用户选项删除它们。

编辑:我尝试使用 END 块。

这是我的代码的外观。

@arr = (John, Daniel, Mary); #there is path for each one of them generated
foreach my $arr (@array){
......
END{
remove_tree("/mydir/names/$array/outputfiles") if defined $cleanup;
};
}

我这样做是因为我希望为每个名称都完成它,但它不起作用。如果我这样做,它确实有效,但我宁愿用一行而不是三行。

@arr = (John, Daniel, Mary); #there is path for each one of them generated
foreach my $arr (@array){
......
END{
remove_tree("/mydir/names/John/outputfiles") if defined $cleanup;
};
}

标签: perl

解决方案


那种工作是END 块的主要用途之一

use File::Path;
...

END {
    remove_tree( ... ) if defined $cleanup;
};

这个特殊的代码块

尽可能晚地执行,也就是说,在 perl 完成程序运行之后并且就在解释器退出之前,即使它是作为die()函数的结果而退出的。(但如果它通过 变形为另一个程序exec,或者被信号吹出水面,则不是 - 你必须自己捕获它(如果可以的话)。)

这些END块也在 上运行exit,并且父END块也在子进程运行。它们可以通过使用POSIX ::_exit(status)而不是exit.

请注意,这是程序生命周期中的一个特殊阶段,有些事情可能不一样。例如,信号处理程序在RUN阶段结束时消失(可以在第一个END块中重新安装)。但是,您可以使用文件系统并清理文件等。


推荐阅读