我试图在 Perl 脚本的顶部分配一个常量,如下所示:
use constant {
# ...
CONSTNAME => qx{readlink -e __FILE__} || __FILE__,
# ...
};
__FILE__不会在qx运算符内部进行插值,这会导致此操作失败。我怎样才能实现我想要的,即在调用shell__FILE__ 之前插入。readlink
请注意:将命令存储在中间变量中不是一种选择。
要直接回答这个问题,您可以使用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 开始)。
使用readpipe等效的函数qx//。Perl 内部的qx//行为大多类似于qq//,然后将结果传递给readpipe. 当引用行为qx//妨碍您时,您可以绕过它并readpipe直接调用。
use constant {
CONSTNAME => readpipe('readlink -e ' . quotemeta(__FILE__)) || __FILE__,
};
quotemeta将有助于防止文件名中可能的 shell 元字符攻击。
全 Perl 解决方案:
my $self = $0;
while( -l $self ){
$self = readlink $self;
}
use constant {
# ...
CONSTNAME => $self,
# ...
};