mkpath文件::路径似乎没有按预期工作

时间:2014-09-15 14:31:34

标签: perl file dir

我正在使用mkpath创建目录。

mkpath('/home/myhome') or die "Create of directory  failed: $!";

如果目录不存在,则此方法有效,但如果该目录存在则会失败。 从perldocs它说它类似于mkdir -p unix。但是,如果目录已存在,则该命令不会失败。

我应该注意什么才能安静地创建一个包含多个路径的目录? v5.8.8

2 个答案:

答案 0 :(得分:3)

mkpath会在出错时抛出异常,因此您需要以下内容:

mkpath('/home/myhome');

如果您需要自定义消息,可以使用以下内容:

eval { mkpath('/home/myhome'); 1 }
   or die "Can't create home directory: $@\n";

请注意使用$@,而不是$!

答案 1 :(得分:1)

doc说:

  

该函数返回实际创建的目录列表   电话;在标量上下文中创建的目录数。

正如ikdegami指出的那样,下一个错误处理将不起作用

mkpath($path) or print "Error creating $path\n" unless -d $path;

因为mkpath会因致命错误而嘶哑。 (使用Carp),因此可以更快地终止执行,因为可以打印错误消息。

...除非mkpath的执行被困在eval块中。 (见ikegami's anser

使用eval捕获,只会返回一个错误。 e.g:

eval { mkpath($p2, $p3); 1 } or die "Can't create home directory: $@\n";

如果$p1$p2都失败了 - 则不会报告所有错误。要打印出所有错误,您可以使用自定义变量来存储诊断消息,请参阅文档的ERROR HANDLING部分

在这种情况下,mkpath不会嘶哑,如果发生致命错误,将返回成功创建的目录数(在标量上下文中),如:

mkpath($path1, $path2 , {error => \my $err});

来自doc:

  

请注意,如果没有遇到错误,$ err将引用空   阵列。这意味着$ err将始终为TRUE;所以你需要   测试@ $ err以确定是否发生错误。

您可以将它们全部打印出来,请参阅文档中的示例。