【问题标题】:Cwd::abs_path() returns undefCwd::abs_path() 返回 undef
【发布时间】:2019-05-23 15:41:28
【问题描述】:

我在使用 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 从 Cwd::abs_path($val); 获取 undef 作为返回值。我不明白为什么会这样

其中一个 cmets 促使我进行了一些进一步的测试。我发现以以下方式依赖斜杠:

  1. 如果目录不存在:不带斜杠,返回带有斜杠的undef

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

  3. 如果目录存在,则在这两种情况下都可以使用,无论是否带有斜杠

【问题讨论】:

  • 目录/home/user123是否存在?
  • 它没有。在这种情况下,undef 是正确的返回值吗?
  • 它应该可以在没有斜杠的情况下工作。
  • @sidyll:不完全是。如果目录本身不存在,它会在没有尾部斜杠的情况下工作,但不会与它一起工作。如果该目录是不存在的目录的子目录,则无论是否带有斜线都将不起作用。如果该目录确实存在,它可以在有和没有斜杠的情况下使用
  • @sidyll 奇怪的是,我也让它的行为与/或没有斜杠不同。但是,该模块适用于文件系统,据我所知,在不存在的路径上使用它是没有意义的。 (在我看来,对斜线的依赖只是强调了这一点。)

标签: perl filesystems


【解决方案1】:

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/我的用户名 未定义 /home/我的用户名/否/这样

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

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

【讨论】:

  • 补充一点,当给定不存在的路径时,Cwd::abs_path 还有其他不可移植的行为。例如在 Windows 上,它有时会死掉。在 IRC 上,有人说它的行为在 Linux、BSD 和 OS X 之间也有所不同,这可能是由于底层的realpath 系统调用。
【解决方案2】:

perl 的真实路径不能很好地回答以“/”结尾的补丁,例如“/home/”

bash 的哪个 realpath 回答得好,

所以如果你想在 perl 中调用 realpath,请注意先修剪最后一个“/”。

【讨论】:

  • 正如目前所写,您的答案尚不清楚。请edit 添加其他详细信息,以帮助其他人了解这如何解决所提出的问题。你可以找到更多关于如何写好答案的信息in the help center
猜你喜欢
  • 1970-01-01
  • 2015-08-17
  • 1970-01-01
  • 2019-01-13
  • 2020-12-08
  • 1970-01-01
  • 1970-01-01
  • 2014-11-19
  • 2020-03-26
相关资源
最近更新 更多