如何在Perl中解析“没有这样的文件或目录”?

时间:2019-08-02 17:45:51

标签: perl

在过去的两周里,我一直在研究脚本,该脚本运行得很好。昨天突然停止了工作。

我正在使用代码mkdir -p $somepath。它开始挂起,所以我插入了“或死”。然后我发现这个错误可能是由于我没有检查它是否已经存在,所以我将代码更改为
unless (-e $somepath) {system ("mkdir -p $somepath") or die "Couldn't make $somepath: $!" };

注意:我也使用不带系统的perl mkdir进行了此操作,但是由于没有任何操作,我尝试了所有操作。

这是奇怪的部分。它实际上是在创建目录,然后死于错误
Couldn't make "insert path here": No such file or directory

因此,似乎它正在执行mkdir,检查它是否确实存在,然后死亡。我不知道为什么它开始这样做,因为我没有更改脚本的任何内容,并且昨天运行良好。如果忘记了任何信息,请告诉我。

编辑:我发现了我的问题。它与任何mkdir都绝对无关。由于某种原因,它来自启用一个选项,该选项允许用户提供路径而不是在代码中具有直接路径。肮脏的修复是暂时禁用该功能。所以问题甚至在我到达mkdir线之前就已经发生了。

1 个答案:

答案 0 :(得分:4)

问题是您添加的... or die

system成功返回0(在布尔上下文中为假),因此只有die成功时,您的代码才会mkdir

此外,如果$!报告退出状态为非零,则system不包含有意义的状态代码。整个No such file or directory消息都是红色鲱鱼。

更好:

system(...) == 0
    or die "mkdir -p $somepath returned $?";

使用单个参数调用system会经过外壳程序,如果$somepath包含例如空格,*或其他特殊字符。

更好:

system('mkdir', '-p', '--', $somepath) == 0
    or die "mkdir -p $somepath returned $?";

事先检查-e $somepath没有意义; mkdir -p会为您解决这个问题。

最后,您不需要运行单独的程序即可创建目录层次结构:

use File::Path qw(make_path);
make_path($somepath);