【问题标题】:How can I make Perl recognize paths with '~'?如何让 Perl 识别带有 '~' 的路径?
【发布时间】:2011-05-01 22:08:31
【问题描述】:

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

我正在运行 Ubuntu。

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

这是为什么呢?

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

更新

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

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

【问题讨论】:

标签: perl home-directory tilde-expansion


【解决方案1】:

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

【讨论】:

  • 中断~/a filename with spaces.txt
  • @Ven'Tatsu:确实如此!但奇怪的是,创建了 2 个文件,abcd.txte gh.txtglob "\Qabc?.txt" 仅返回 abc?.txt(即未扩展,?d 不匹配),而 glob "\Qe g?.txt" 返回 e gh.txt(即 ? 现在出于某种原因与 h 匹配)。我的脑袋疼。
  • @j_random_hacker,奇怪,bashcsh shell 扩展将\?quotemeta 产生在这两种情况下作为文字?,不匹配任何一个字符。我不知道为什么perl 会给出不同的结果。
  • j_random_hacker,glob documentation 明确表示该函数在空白处拆分。因此你必须引用它。 glob '~/a\ filename\ with\ spaces.txt' 按预期工作。
【解决方案2】:

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

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

【讨论】:

  • 除此之外,我对问题的原始措辞并不那么聪明。对于我的“真实”问题 - 请参阅 OP 的更新 2。
【解决方案3】:

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

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

【讨论】:

  • 中断~/a filename with spaces.txt
【解决方案4】:

尝试用$ENV{HOME}替换~

【讨论】:

  • @Wooble,确实,你也可以使用((getpwnam('someuser'))[7])
【解决方案5】:

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

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

e 标志用 executingevaluating 替换表达式的 result 替换表达式。

【讨论】:

    【解决方案6】:

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

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

    &lt;xxx&gt; 迭代运算符,人们通常认为它是 readline 函数的语法糖,如果 xxx 中有 shell 元字符和波浪号计数,则改为调用 glob 函数作为其中之一。

    您可能更喜欢&lt;:encoding(Latin1) 的开放模式。这仅取决于文件。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-04-15
      • 2017-05-04
      相关资源
      最近更新 更多