我创建了一个使用abs_path
的perl脚本,但它没有正确处理主目录(由'〜'表示)
如果我尝试拨打abs_path("~/mystuff");
返回undef
我可以让abs_path
正确处理主目录吗?如果没有,我可以使用另一种选择吗?
答案 0 :(得分:5)
#!/usr/bin/perl
use File::HomeDir;
print File::HomeDir->my_home;
答案 1 :(得分:2)
abs_path
无法正确处理它的原因是“〜”是 shell 构造。 Perl对“〜”的含义一无所知 - 它在字面上将其视为“当前工作目录下名为'tilde'(〜)的目录”。
任何以“〜”作为参数提供的程序实际上都会从shell获得真正的目录路径。
为了能够使用Perl的主目录,在Unix上,您可以使用$ENV{HOME}
而不是“〜”作为您自己的主目录;或其他用户使用(getpwnam($user))[7]
;没有干净的跨平台方式。
第二种方法是在系统调用中使用shell进行脏工作:
my $expanded_home_dir = `cd ~/mydir/; pwd`;
<强>更新强>
首先,在“Perl Cookbook”(第2版)中,一个非常好的直接替换波形家庭字符串的方法。 7.3“扩展文件名中的波浪号”。
其次,正如评论中提到的daxim,自Perl 5.6起,CORE::glob()
实际上会自动替换为File::Glob::bsd_glob()
,它支持POSIX的GLOB_TILDE
标记,因此可以扩展适合你。
有趣的是,bsd_glob(在C代码中,根据Perlmonks)和安德鲁·克拉克明智地提到的File::HomeDir
,使用与Cookbook的配方7.3($ENV{HOME}||$ENV{LOGDIR}||(getpwnam($<))[7]
)完全相同的逻辑的环境中。