質問
私はそうのようなPerlスクリプトの上部に定数を割り当てようとしています:
use constant {
# ...
CONSTNAME => qx{readlink -e __FILE__} || __FILE__,
# ...
};
__FILE__
内部に補間されません qx
これが失敗するオペレーター。どうすれば自分が望むものを達成できますか、それは補間することです __FILE__
前 電話 readlink
シェルの。
注:中間変数内にコマンドを保存することはオプションではありません。
解決
質問に直接答えるには、副展開 - 弦-発現中のイディオムを使用することができます。 Perlref:
print qx{echo @{[ __FILE__ ]}};
コメントで提起されたいくつかの警告:
-
[]
消耗品リストコンテキスト。それはここでは問題ではありませんが、一般的に認識する価値があります。 - もしあなたは困ることができます
__FILE__
シェルメタチャラクターがあります。
あなたの目標がすべてのSymlinksを解決したPerlスクリプトのパスを見つけることである場合、あなたは FindBin
モジュール. FindBin
しばらくの間、Core Perlの分布の一部でした(少なくとも5.004以降 http://search.cpan.org/~chips/perl5.004/).
他のヒント
全ペルルソリューション:
my $self = $0;
while( -l $self ){
$self = readlink $self;
}
use constant {
# ...
CONSTNAME => $self,
# ...
};
使用する readpipe
に相当する関数 qx//
. 。 Perlの内部 qx//
ほとんどのように振る舞います qq//
そして、結果を渡します readpipe
. 。の引用動作の場合 qx//
あなたがそれをバイパスして電話することができる邪魔になります readpipe
直接。
use constant {
CONSTNAME => readpipe('readlink -e ' . quotemeta(__FILE__)) || __FILE__,
};
quotemeta
ファイル名で、可能なシェルメタカラクター攻撃を防ぐのに役立ちます。
所属していません StackOverflow