Cwd::abs_path() returns 未定义
Cwd::abs_path() returns undef
我在使用 abs_path()
时遇到问题。我给这个函数一个有效路径,但我得到 undef
作为 return 值。使用以下代码从命令行读取路径。
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 从 Cwd::abs_path($val);
中获取 undef
作为 return 值。我不明白为什么会这样
其中一条评论促使我做一些进一步的测试。我发现以下列方式依赖于尾部斜杠:
如果目录不存在:工作时没有尾部斜杠,returns undef
有尾部斜杠。
如果目录是不存在目录的子目录,总是returns undef
如果目录存在,在两种情况下都有效,有或没有尾部斜杠
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,它有很多方法可以处理现有和不存在的路径。
perl 的真实路径不能很好地回答以“/”结尾的补丁,例如“/home/”
bash哪个realpath回答得好,
所以如果你想在 perl 中调用 realpath,请注意 trim 最后一个“/”在前。
我在使用 abs_path()
时遇到问题。我给这个函数一个有效路径,但我得到 undef
作为 return 值。使用以下代码从命令行读取路径。
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 从 Cwd::abs_path($val);
中获取 undef
作为 return 值。我不明白为什么会这样
其中一条评论促使我做一些进一步的测试。我发现以下列方式依赖于尾部斜杠:
如果目录不存在:工作时没有尾部斜杠,returns
undef
有尾部斜杠。如果目录是不存在目录的子目录,总是returns
undef
如果目录存在,在两种情况下都有效,有或没有尾部斜杠
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,它有很多方法可以处理现有和不存在的路径。
perl 的真实路径不能很好地回答以“/”结尾的补丁,例如“/home/”
bash哪个realpath回答得好,
所以如果你想在 perl 中调用 realpath,请注意 trim 最后一个“/”在前。