如何让Perl识别带有"“的路径?

gkn4icbw  于 2023-10-24  发布在  Perl
关注(0)|答案(7)|浏览(180)

可能重复:

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的更新版本。

xqnpmsa8

xqnpmsa81#

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

fcy6dtqo

fcy6dtqo2#

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

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

lstz6jyr3#

glob函数理解标准Unix文件globbing。

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

9bfwbjaz4#

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

fslejnso

fslejnso5#

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

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

e标志将表达式替换为 executingevaluating replace表达式的 result

w41d8nur

w41d8nur6#

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

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

<xxx>迭代运算符,人们通常认为是readline函数的语法糖,如果在 xxx 中有shell元字符,而波浪号计数为其中之一,则调用glob函数。
您可能更喜欢<:encoding(Latin1)的开放模式,这取决于文件。

krugob8w

krugob8w7#

这个有点晚了,但是一个简单的解决方案是对文件名/路径中的空格进行双转义,这样glob就不会中断。(甚至可能是windows?),然后将结果值存储在var中以便于使用。正则表达式可以使用双反斜杠转义来替换文件名中的空格。例如,sans regex:

my $dir_name  = "~/Shared\\ Items/a\\ filename\\ with\\ spaces.txt";
my $glob_name = glob($dir_name);

print "exists!\n" if -e $glob_name;

相关问题