#perl #variable-assignment #perl-module
Вопрос:
я хотел назначить переменную $run
в модуле perl и проверить состояние if. В основном $run
переменной присваивается последнее значение текущего рабочего каталога и в условии if, если скрипт perl проверяет значение, присвоенное переменной $run
часть фрагмента кода скрипта модуля perl, в котором была замечена точная проблема.
ex.pm
-----
my $run = ${PWD##*/};
if ( $2 ne $run)
{
die "$0 should be run in a $run directory.";
}
с этим кодом у меня возникает проблема с компиляцией. то же самое, если у вас есть условие if со значением последнего пути, жестко закодированным, оно работает хорошо if ( $2 ne '4')
.
сообщения о проблемах компиляции
syntax error at bin/ex.pm line 44, near ")
{"
syntax error at bin/ex.pm line 49, near "$sitepath "
BEGIN not safe after errors--compilation aborted at bin/TestConstants.pm line 72.
Compilation failed in require at bin/ex1.pm line 13.
BEGIN failed--compilation aborted at bin/ex1.pm line 13.
Compilation failed in require at ./bin/test.pl line 26.
BEGIN failed--compilation aborted at ./bin/test.pl line 26 (#1)
(F) Probably means you had a syntax error. Common reasons include:
A keyword is misspelled.
A semicolon is missing.
A comma is missing.
An opening or closing parenthesis is missing.
An opening or closing brace is missing.
A closing quote is missing.
Ответ №1:
Вы не можете использовать синтаксис bash в Perl.
$run = ${PWD##*/};
Правая сторона-это простой способ сказать «Удалить все до последней косой черты», который в Perl записывается как
$run = $ENV{PWD} =~ s{.*/}{}r;
или
$run = substr $ENV{PWD}, 1 rindex $ENV{PWD}, '/';
Комментарии:
1.
$run = $ENV{PWD} =~ s{.*/}{}r;
здесь переменной $run присваивается$ENV{PWD}
и$ENV{PWD}
присваивается=~ s{.*/}{}r;
. так вот что происходит с этой линией? с добавлением этой строки возникнет проблема компиляции.2. Нет, во
$ENV{PWD}
всем, вплоть до последнего/
, подставляется пустая строка, и результат присваивается$run
. Для работы модификатора требуется Perl 5.14r
(10 лет).