質問

私はそうのような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 ファイル名で、可能なシェルメタカラクター攻撃を防ぐのに役立ちます。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top