如何让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;