7

可能重复:
如何在 Perl 中找到用户的主目录?

我正在运行 Ubuntu。

每当我向 Perl 脚本传递一个以~(eg ~/Documents/file.txt) 开头的路径时,它都找不到它。我必须通过规范路径(例如/home/dave/Documents/file.txt)。

这是为什么?

我可以让 Perl 识别~路径吗?

更新

所有建议的解决方案都包括更改脚本中的代码。我想要一个不涉及对脚本本身进行任何更改的解决方案(因为并非所有脚本都是我的)。也许是 Bash 的工作方式?

该问题的更新版本已发布在 Super User

4

6 回答 6

8

您可以传递路径以glob使其扩展。

于 2010-10-28T14:25:26.573 回答
6

对于可靠(且简单)的跨平台方法,请尝试File::HomeDir

use File::HomeDir;
print File::HomeDir->my_home;
于 2010-10-28T14:39:43.893 回答
6

glob函数理解标准的Unix 文件通配。

my $file = glob('~/Documents/file.txt');
于 2010-10-28T14:26:14.647 回答
4

尝试替换~$ENV{HOME}

于 2010-10-28T14:23:11.670 回答
3

使用角引号,而不是双引号:

open(my $fh, "< :crlf :encoding(cp1252)",
              <~/Documents/file.txt>)
    || die "couldn't open Winblose text file ~/Documents/file.txt: $!";

<xxx>迭代运算符,人们通常认为它是函数的语法糖,如果xxx中有 shell 元字符,并且波浪号计数是其中之一,则会readline调用该函数。glob

您可能更喜欢<:encoding(Latin1). 它只取决于文件。

于 2010-10-28T14:38:40.990 回答
3

从布鲁诺的评论,你可以这样做:

$path =~ s/^~(\w*)/ ( getpwnam( $1 || $ENV{USER} ))[7] /e;

e标志用执行评估替换表达式的结果替换表达式。

于 2010-10-28T16:28:12.023 回答