3

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

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

__FILE__不会在qx运算符内部进行插值,这会导致此操作失败。我怎样才能实现我想要的,即在调用shell__FILE__ 之前插入。readlink

请注意:将命令存储在中间变量中不是一种选择。

4

3 回答 3

8

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

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

评论中提出了一些警告:

  • []耗材清单上下文。这在这里无关紧要,但总的来说值得注意。
  • 如果__FILE__有 shell 元字符,您可能会遇到麻烦。

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

于 2011-05-03T18:39:42.600 回答
2

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

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

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

于 2011-05-04T14:49:12.197 回答
2

全 Perl 解决方案:

my $self = $0;
while( -l $self ){
  $self = readlink $self;
}
use constant {
  # ...
  CONSTNAME => $self,
  # ...
};
于 2011-05-03T22:09:14.193 回答