我试图在 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 脚本的路径,您可能需要查看FindBin
module。一段时间以来一直是核心 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,
# ...
};