Cwd::abs_path() 返回 undef

Yak*_*Dan 5 filesystems perl

我在使用时遇到问题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";
Run Code Online (Sandbox Code Playgroud)

perl脚本执行如下:

perl pl_test.pl -results_dir = /home/user123/
Run Code Online (Sandbox Code Playgroud)

我得到以下结果:

3
-results_dir
=
/home/user123/
/home/user123/
Use of uninitialized value in concatenation (.) or string at pl_test.pl line 16.
Run Code Online (Sandbox Code Playgroud)

我已经使用调试器验证了问题是 $resultundef从 获取作为返回值Cwd::abs_path($val);。我不明白为什么会发生这种情况

其中一条评论促使我进行了一些进一步的测试。我发现存在对尾部斜杠的依赖性,如下所示:

  1. 如果目录不存在:在没有尾部斜杠的情况下工作,undef以尾部斜杠返回。

  2. 如果该目录是不存在的目录的子目录,则始终返回undef

  3. 如果目录存在,则在两种情况下都有效,带或不带尾部斜杠

zdi*_*dim 4

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")
'
Run Code Online (Sandbox Code Playgroud)

这打印

/home/我的用户名
未定义
/home/我的用户名/no/such

尾部斜杠不会影响任一模块的(有意义的)操作。

另一个有用的工具是Path::Tiny,它提供了许多方法来处理现有和不存在的路径。