如何让Perl识别带有'〜'的路径?

时间:2010-10-28 14:19:39

标签: perl home-directory tilde-expansion

  

可能重复:
  How do I find a user's home directory in Perl?

我正在运行Ubuntu。

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

为什么?

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

更新

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

问题was posted at Super User的更新版本。

6 个答案:

答案 0 :(得分:6)

您可以将路径传递给glob以扩展它。

答案 1 :(得分:6)

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

use File::HomeDir;
print File::HomeDir->my_home;

答案 2 :(得分:5)

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

my $file = glob('~/Documents/file.txt');

答案 3 :(得分:3)

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

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

<xxx>迭代运算符,人们通常认为是readline函数的语法糖,如果 xxx中存在shell metachars,则会调用glob函数,和tilde算作其中之一。

您可能更喜欢<:encoding(Latin1)的开放模式。它只取决于文件。

答案 4 :(得分:3)

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

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

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

答案 5 :(得分:1)

尝试将~替换为$ENV{HOME}