Как использовать __FILE__ внутри qx? - PullRequest
3 голосов
/ 03 мая 2011

Я пытаюсь присвоить константу в верхней части скрипта Perl следующим образом:

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

__FILE__ не интерполируется внутри оператора qx, что приводит к сбою.Как мне добиться того, что я хочу, то есть интерполировать __FILE__ до вызова readlink оболочки.

Обратите внимание: нельзя хранить команду внутрипромежуточная переменная между ними.

Ответы [ 3 ]

8 голосов
/ 03 мая 2011

Чтобы непосредственно ответить на вопрос, вы можете использовать идиому «интерполировать произвольное выражение в строке», описанную в perlref :

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

Несколько предостережений, высказанных в комментариях:

  • Контекст списка [].Здесь это не имеет значения, но о них стоит знать в целом.
  • Вы можете попасть в беду, если __FILE__ имеет метасимволы оболочки.

Если ваша цель - найтиПуть вашего Perl-скрипта со всеми разрешенными символическими ссылками, вы можете посмотреть на FindBin модуль .FindBin был частью ядра Perl-дистрибутива в течение некоторого времени (по крайней мере, начиная с 5.004 согласно http://search.cpan.org/~chips/perl5.004/).

2 голосов
/ 04 мая 2011

Используйте readpipe функциональный эквивалент qx//.Внутренний для Perl qx// в основном ведет себя как qq// и затем передает результат в readpipe.Когда поведение цитирования qx// мешает, вы можете обойти его и напрямую вызвать readpipe.

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

quotemeta поможет защититься от возможных атак метасимволов оболочки в имени файла.

2 голосов
/ 04 мая 2011

All-Perl решение:

my $self = $0;
while( -l $self ){
  $self = readlink $self;
}
use constant {
  # ...
  CONSTNAME => $self,
  # ...
};
...