如何让Perl识别带有'~';?

如何让Perl识别带有'~';?,perl,home-directory,tilde-expansion,Perl,Home Directory,Tilde Expansion,可能重复: 我在运行Ubuntu 每当我向Perl脚本传递以~开头的路径(例如~/Documents/file.txt)时,它都无法找到它。我必须传递规范路径(例如/home/dave/Documents/file.txt) 为什么呢 我可以让Perl识别路径吗 更新 所有建议的解决方案都包括更改脚本中的代码。我想要一个解决方案,它不会涉及对脚本本身的任何更改(因为不是所有脚本都是我的)。也许是Bash工作方式的问题 问题的更新版本。尝试将~替换为$ENV{HOME}您可以将路径传递到glob

可能重复:

我在运行Ubuntu

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

为什么呢

我可以让Perl识别路径吗

更新

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


问题的更新版本。

尝试将
~
替换为
$ENV{HOME}
您可以将路径传递到
glob
,以将其展开。

该函数理解标准的Unix文件globbing

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

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

open(my $fh, "< :crlf :encoding(cp1252)",
              <~/Documents/file.txt>)
    || die "couldn't open Winblose text file ~/Documents/file.txt: $!";
open(my$fh),<:crlf:encoding(cp1252)”,
)
||die“无法打开Winblose文本文件~/Documents/file.txt:$!”;
迭代运算符通常被认为是
readline
函数的语法糖,如果xxx中有shell元字符,则调用
glob
函数,tilde算作其中之一

对于可靠(且简单)的跨平台方法,您可能更喜欢
的开放模式,请尝试:


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

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

e
标志将表达式替换为执行或计算替换表达式的结果。

~/a带有空格的文件名上中断。txt
@Ven'Tatsu:确实如此!但奇怪的是,创建两个文件,
abcd.txt
e gh.txt
glob“\Qabc?.txt”
只返回
abc?.txt
(即未展开,
不匹配
d
),而
glob”\Qe g?.txt“
返回
e gh.txt
(即
由于某种原因现在匹配
h
)。我的大脑很痛。@j_random_hacker,奇怪,
bash
csh
外壳扩展将
\?
在这两种情况下由
quotemeta
产生的
视为一个文本
,与任何一个字符都不匹配。我不知道为什么
perl
会给出不同的结果。j_random_hacker,这个函数明确地说是在空格上拆分的。因此,你必须引用它
glob'~/a\filename\with\spaces.txt'
按预期工作。在
~/a filename with spaces.txt
@Wooble上中断,实际上,你也可以使用
((getpwnam('someuser'))[7])
I,除了这一点,因为我最初对这个问题的措辞并没有那么清楚。有关我的“真实”问题,请参阅OP上的更新2。可能重复的
$path =~ s/^~(\w*)/ ( getpwnam( $1 || $ENV{USER} ))[7] /e;