abs_path与主目录

时间:2010-12-10 00:44:15

标签: perl

我创建了一个使用abs_path的perl脚本,但它没有正确处理主目录(由'〜'表示)

如果我尝试拨打abs_path("~/mystuff");

,则为EG

返回undef

我可以让abs_path正确处理主目录吗?如果没有,我可以使用另一种选择吗?

2 个答案:

答案 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])完全相同的逻辑的环境中。