【问题标题】:How to use __FILE__ inside qx?如何在 qx 中使用 __FILE__?
【发布时间】:2011-05-03 18:34:16
【问题描述】:

我正在尝试在 Perl 脚本的顶部分配一个常量,如下所示:

use constant {
  # ...
  CONSTNAME => qx{readlink -e __FILE__} || __FILE__,
  # ...
};

__FILE__ 没有被插入到 qx 运算符中,这会导致此操作失败。我怎样才能实现我想要的,即插入__FILE__ before 调用readlink 的shell。

请注意:不能将命令存储在中间变量中。

【问题讨论】:

  • @TLP:它们在所有平台上是否总是包含相同的值?
  • @TLP 或标准的FindBin module
  • @Andy: "standard" 暗示它是核心 Perl?
  • 是的,标准意思是core perl,至少根据search.cpan.org/~chips/perl5.004回到5.004
  • 为什么不能使用临时工?

标签: perl qx


【解决方案1】:

直接回答问题,可以使用perlref中描述的interpolate-arbitrary-expression-in-string成语:

print qx{echo @{[ __FILE__ ]}};

在 cmets 中提出了一些警告:

  • [] 供应列表上下文。这在这里无关紧要,但总体上值得注意。
  • 如果__FILE__ 有shell 元字符,您可能会遇到麻烦。

如果您的目标是找到已解析所有符号链接的 perl 脚本的路径,您可能需要查看 FindBin moduleFindBin 一直是核心 perl 发行版的一部分(至少从 5.004 开始,根据 http://search.cpan.org/~chips/perl5.004/)。

【讨论】:

  • @Andy:谢谢。今天学到了新东西。并特别感谢您的迅速答复。我会尽快接受。
  • 但要小心:方括号为其表达式提供列表上下文。在这种情况下,这无关紧要,但如果这样做,请使用显式 scalar 强制上下文:say "mysub returns @{ [scalar mysub(1,2,3)] } now."Programming Perl, 3rd edition, page 259.跨度>
  • @hobbs 我同意应该谨慎使用它。在确定“成语”之前,我考虑了较少的赞美词; perlref 称之为“诡计”。
  • @tchrist: 或者特殊的标量函数调用语法:~~mysub(...)(开个玩笑)
  • @Sean:我明白了。没有考虑这个。感谢您指出。
【解决方案2】:

全 Perl 解决方案:

my $self = $0;
while( -l $self ){
  $self = readlink $self;
}
use constant {
  # ...
  CONSTNAME => $self,
  # ...
};

【讨论】:

  • 感谢您的努力,但由于编码风格,我想避免在常量之前使用任何变量。仍然 +1,因为它可以在没有限制的情况下工作。
【解决方案3】:

使用readpipe 等效于qx// 的功能。 Perl 内部qx// 的行为主要类似于qq//,然后将结果传递给readpipe。当qx// 的引用行为妨碍您时,您可以绕过它并直接调用readpipe

use constant {
    CONSTNAME => readpipe('readlink -e ' . quotemeta(__FILE__)) || __FILE__,
};

quotemeta 将有助于防止文件名中可能的 shell 元字符攻击。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-08-03
    • 2011-03-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多