Имеет ли значение порядок параметров командной строки в Perl?

Причина в порядке, в котором оболочка обрабатывает различные расширения и кавычки. Если вы наберете

напрямую
find. -name "foo*"

Оболочка удалит кавычки и передаст foo*в качестве параметра в find.

Без кавычек оболочка сначала выполнит подстановку для *, что потенциально может привести к множественным совпадениям, что приведет к путанице find. Поэтому разумно использовать кавычки.

Но если вы readвыберете строку из файла, переменная будет содержать кавычки. Теперь, когда вы это сделаете

> echo $LINE
"foo*"
> echo "foo*"
foo*
> find. -name $LINE

вы видите, что кавычки $LINEне будут удалены, в отличие от кавычек для echo "foo*". Это связано с тем, что оболочка сначала обрабатывает кавычки echo $LINE(, а )нет, а затем выполняет подстановку переменных, поэтому строка будет читаться как echo "foo*", но теперь кавычки остаются.

Итак, ваш findбудет искать файлы, содержащие кавычки. Решение состоит в том, чтобы оставить кавычки в файле. Там кавычки не нужны, вся строка будет идти в переменную.

2
16.09.2019, 15:51
2 ответа

Из справочной страницы perlrun:

perl... [ [-e|-E] 'command' ]...

Все, что следует за параметром -e, perl обрабатывает как команду. С -nel, lявляется командой для -e. print $1 if /install\(TARGETS (.*) RUNTIME DESTINATION bin\)/является первым аргументом опции, отличной от -, и он становится входным файлом, который perl пытается открыть и терпит неудачу.

Сравните, скажем, с:

~ echo  foo | perl -neprint
foo
3
27.01.2020, 21:50

Опция -eпринимает аргумент, строку, которая будет оцениваться как код Perl. Когда вы используете perl -lne '...'и perl -nle '...', это работает так, как предполагалось, поскольку порядок параметров не важен (в этом случае ).

Однако, когда вы используете perl -nel '...', вы говорите «вычислить строку lкак код Perl и использовать '...'как имя файла, который будет считан этим кодом», что не имеет особого смысла (вот почему вы получаете эту странную ошибку «Нет такого файла или каталога» ).

Таким образом, нет, порядок опций не важен (здесь ), но если вы перемещаете опцию -e, вы должны переместить аргумент опции -, код Perl, с так, чтобы код Perl всегда шел сразу после этой опции.

Таким образом, если вы хотите, например, поставить параметр -eпервым, используйте

perl -e '...' -ln

Порядок параметров до perlважен, если вы смешиваете такие параметры, как -pи -nв одной командной строке. Опция -pбудет переопределена более поздней опцией -nи наоборот, поэтому perl -npсовпадает с perl -p, а perl -pnсовпадает с perl -n. Это описано в руководстве perlrun(, см. man perlrunили perldoc perlrun).

6
27.01.2020, 21:50

Теги

Похожие вопросы