我在使用abs_path()
时遇到问题。我为该函数提供了有效路径,但我得到了undef
作为返回值。使用以下代码从命令行读取路径。
use warnings;
use strict;
use Data::Dumper;
use Cwd qw();
print scalar @ARGV;
print "\n";
print "$ARGV[0]\n";
print "$ARGV[1]\n";
print "$ARGV[2]\n";
my $val = $ARGV[2];
print "$val\n";
my $result = "";
$result = Cwd::abs_path($val);
print "$result\n";
perl脚本执行如下:
perl pl_test.pl -results_dir = /home/user123/
我得到以下结果:
3
-results_dir
=
/home/user123/
/home/user123/
Use of uninitialized value in concatenation (.) or string at pl_test.pl line 16.
我已使用调试器验证了问题在于$ result从undef
获得Cwd::abs_path($val);
作为返回值。我不明白为什么会这样
其中一条评论促使我进行了进一步的测试。我发现以以下方式依赖于斜杠:
如果该目录不存在:可以不带斜杠而工作,并返回带有斜杠的undef
。
如果该目录是不存在的目录的子目录,则始终返回undef
如果目录存在,则在两种情况下都可以使用,带有或不带有斜杠
答案 0 :(得分:2)
Cwd
确实使用了文件系统,因此您不应该要求它使用不存在的路径。
我已经确认观察到,如果它确实存在(并且没有斜杠!)的目录中,它确实会给我返回一个路径,该目录不存在。但是,这并不意味着模块的目的是使用现有路径。
要使用通常不需要文件的文件名,请使用核心File::Spec
perl -MCwd=abs_path -MFile::Spec=rel2abs -wE'
say abs_path(".");
say abs_path("./no/such") // "undef";
say File::Spec->rel2abs("./no/such")
'
此打印
/home/my-user-name undef /home/my-user-name/no/such
尾部的斜杠不会影响任何一个模块的(有意义的)操作。
另一个有用的工具是Path::Tiny,它提供了许多方法来处理现有路径和不存在的路径。