gpt4 book ai didi

perl - Cwd::abs_path() 返回 undef

转载 作者:行者123 更新时间:2023-12-01 04:43:09 25 4
gpt4 key购买 nike

我在使用 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
  • 如果目录存在,在两种情况下都可以使用,带或不带斜杠
  • 最佳答案

    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 , 有许多方法可以使用现有和不存在的路径进行各种工作。

    关于perl - Cwd::abs_path() 返回 undef,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53914055/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com