3

次のように、Perlスクリプトの先頭に定数を割り当てようとしています。

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

__FILE__演算子内で補間されないためqx、これは失敗します。シェルを呼び出す__FILE__ に補間するという、私が望むことをどのように達成できますか。readlink

注意:コマンドを中間変数内に格納することはできません。

4

3 に答える 3

8

質問に直接答えるには、perlrefで説明されているinterpolate-arbitrary-expression-in-stringイディオムを使用できます。

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

コメントで提起されたいくつかの警告:

  • 消耗品リストの[]コンテキスト。ここでは問題ではありませんが、一般的に知っておく価値があります。
  • __FILE__シェルのメタ文字があると、問題が発生する可能性があります。

すべてのシンボリックリンクが解決されたperlスクリプトのパスを見つけることが目標である場合は、FindBinモジュールを確認することをお勧めします。FindBinしばらくの間、コアperlディストリビューションの一部でした(少なくともhttp://search.cpan.org/~chips/perl5.004/によると5.004以降)。

于 2011-05-03T18:39:42.600 に答える
2

オールPerlソリューション:

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

readpipeと同等の関数を使用しますqx//。Perlの内部では、qx//ほとんどの場合、のように動作qq//し、結果をに渡しreadpipeます。の引用動作がqx//邪魔になると、それをバイパスしてreadpipe直接呼び出すことができます。

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

quotemetaファイル名で発生する可能性のあるシェルメタ文字攻撃から保護するのに役立ちます。

于 2011-05-04T14:49:12.197 に答える