我有 Perl 脚本。我检查用户是否在 pattern 中传递了一个参数-d dir_name
。
my $len = @ARGV;
if($len == 2 ){
if($ARGV[0] eq "-d"){
$passed_name=$ARGV[1];
return;
}
}
用户传递第二个参数,例如/this/is/path/dir_name
现在我想检查用户是否对该目录具有权限,然后检查是否dir_name
存在(如果不存在 - 我必须创建它)。
现在我想检查用户是否对该目录有权限,然后检查 dir_name 是否存在(如果不存在 - 我必须创建它)。
“先检查后做”会引发竞争条件,如果两件事情同时尝试相同的事情,一个将会失败。
Process 1 Process 2
-----------------------------------
| Check "dir"
| Check "dir"
t mkdir "dir"
i success
m mkdir "dir"
e error, it already exists
|
V
相反,做它并决定如果出现错误该怎么办。
Perl 的错误检查基于C 的 errno.h。要检查发生了什么类型的错误,请查看%!
哈希中的错误是否为真。在这种情况下,我们正在寻找EEXIST
(文件存在)。
# It did not make the directory, and it wasn't because it already existed.
if( !mkdir $passed_name and !$!{EEXIST} ) {
die "Could not create $passed_name: $!";
}
else {
print "$passed_name was created, or it already existed.\n";
}
请注意,mkdir
不会制作必要的子目录。/this/is/path/
必须存在才能使/this/is/path/dir_name
. 如果您希望它创建子目录,请使用make_path
from File::Path。或者更好的是,优秀的Path::Tiny。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句