переменных среды в Perl спросил

Изменено 3 года, 6 месяцев назад

Просмотрено 32к раз

Кажется, я могу получить доступ к переменным среды в Perl, просто выполнив:

 use Env;
напечатать ${ПУТЬ};
 

Это ожидаемое поведение?

Документы Env говорят, что вам нужно сделать $ENV{PATH} .

  • perl
  • переменные среды

Env говорит

Perl поддерживает переменные среды в специальном хеше с именем %ENV . Когда этот метод доступа неудобен, модуль Perl Env позволяет обрабатывать переменные среды как скалярные или массивные переменные.

Итак, да, это законно, и ожидаемое использование переменных равно

$PATH , $USER , $HOME и т. д.

Однако этот модуль

По умолчанию он связывает все существующие переменные среды ( ключей %ENV ) со скалярами.

, и я предпочитаю использовать хэш %ENV напрямую, а не его связанные аналоги. (См. исходный код основного модуля Env на его странице CPAN.)

Да, это ожидаемое поведение из-за взаимодействия двух факторов:

  1. Вы использовали модуль Env с псевдонимом $ENV{PATH} на $PATH .

Обратите внимание, что $ENV{PATH} — это

, всегда доступный в Perl. use Env просто добавляет псевдонимы к содержимому %ENV , делать %ENV доступным не требуется:

 $ perl -E 'say $ENV{LANG}'
en_US.UTF-8
 
  1. ${PATH} — не что иное, как более подробный способ сказать $PATH . Конструкция ${...} (и ее родственники, @{. ..} и %{...} ) чаще всего используется для интерполяции внутри строк в двойных кавычках, чтобы заставить Perl распознавать все содержимое {...} как имя переменной, а не более короткое имя, за которым следует буквальный текст, но синтаксис также можно использовать в других контекстах.

Простая демонстрация этого:

 $ perl -E '$foo = "bar"; скажи ${foo}'
бар
 

Используйте $ENV в формате предопределенной переменной в Perl

 напечатать $ENV{ПУТЬ};
 
3

Зарегистрируйтесь или войдите в систему

Зарегистрируйтесь с помощью Google

Зарегистрироваться через Facebook

Зарегистрируйтесь, используя адрес электронной почты и пароль

Опубликовать как гость

Электронная почта

Требуется, но не отображается

Опубликовать как гость

Электронная почта

Требуется, но не отображается

Нажимая «Опубликовать свой ответ», вы соглашаетесь с нашими условиями обслуживания и подтверждаете, что прочитали и поняли нашу политику конфиденциальности и кодекс поведения.

bash — /usr/bin/env perl работает как команда, но не в сценарии perl

спросил

7 лет, 5 месяцев назад

Изменено 7 лет, 5 месяцев назад

Просмотрено 10 тысяч раз

У меня есть Perl-скрипт, который содержит первую строку следующим образом:

 #!/usr/bin/env Perl
 

Я уже читал, что это выполняется для поиска Perl в среде. Но теперь, когда я выполняю это в командной строке /usr/bin/env perl , запускается сам perl (который находится по адресу /usr/bin/perl ). Но когда я запускаю скрипт с помощью ./myscript.pl , он показывает следующую ошибку:

 /usr/bin/env: Нет такого файла или каталога
 

Это происходит из-за того, что он не может найти perl , потому что эта ошибка также появляется, когда я набираю /usr/bin/env ххххххх . M 9M представляет символ CR), а у вас его нет.

2

Ответ на вопрос:

Может кто-нибудь объяснить мне, в чем именно разница, когда я запускаю его в командной строке или в сценарии?

 #!/usr/bin/env perl
 

Это в основном говорит ОС (которая понимает шебанг) ​​найти первый исполняемый файл «perl» в списке $PATH и выполнить эту программу, добавив имя текущего файла после шебанга. Он не вызывает «perl» напрямую, как этот шебанг, который вы найдете в большинстве программ на Perl:

 #!/USR/бен/перл
 

Это связано с тем, что большинство UNIX-подобных систем (особенно Linux) поставляются с perl, установленным в /usr/bin/perl. Некоторые UNIX не имеют Perl по умолчанию, но могут быть легко установлены позже. Просто они могут оказаться в /usr/local/bin/perl. Обычно perl-программисты называют их «системным perl».

Первый возьмет первый perl в вашем $PATH, а второй возьмет тот, который поставляется с вашей системой.

Если вы не укажете полный путь в оболочке, она также использует то, что указано первым в вашем $PATH.

10

Зарегистрируйтесь или войдите в систему

Зарегистрируйтесь с помощью Google

Зарегистрироваться через Facebook

Зарегистрируйтесь, используя адрес электронной почты и пароль

Опубликовать как гость

Электронная почта

Требуется, но не отображается

Опубликовать как гость

Электронная почта

Требуется, но не отображается

Нажимая «Опубликовать свой ответ», вы соглашаетесь с нашими условиями обслуживания и подтверждаете, что прочитали и поняли нашу политику конфиденциальности и кодекс поведения.