$ ENV {$ variable} в Perl - PullRequest
       13

$ ENV {$ variable} в Perl

2 голосов
/ 05 ноября 2019

Это в любом случае в Perl для расширения переменной в $ ENV {$ variable}?

Я экспортировал «a = T» и «T = b» в оболочку, и я запускаю сценарий Perl вкоторый печатает "$ ENV {$ a} \ n", но ничего не печатается. Я хочу, чтобы «б» можно было печатать, тогда как мне поступить в Perl?

1 Ответ

9 голосов
/ 05 ноября 2019

Вы говорите, что эти переменные среды должны быть связаны, поэтому

$ENV{ $ENV{a} };

Примечание: не $a, а a, например $ENV{USER} и т. Д. При этом используется хеш %ENV (см. perlvar ), который имеет текущее окружение, поэтому ключами являются имена переменных окружения.


По-видимому, представляет интерес использование переменной Perl (для имени переменной оболочки ) в %ENV, а не строковый литерал, как указано выше. В этом случае нам нужно как-то передать эту переменную оболочки, ее имя или значение программе Perl, чтобы она хранилась в переменной;Я не могу просто использовать его напрямую.

Кстати, одним из способов передачи переменной из оболочки в Perl является именно ее экспорт, что делает ее доступной через %ENV. Тем не менее, он также может быть передан как обычно, через командную строку. Предполагая использование однострочного Perl (обычно в сценариях оболочки), у нас есть два варианта передачи

  • в качестве аргумента perl -we'...' "$var", в этом случае он доступенв @ARGV

  • С помощью командного переключателя -s , perl -s -we'...' -- -shv="$var", что задает переменную $shv в однострочнике со значением$var. -- отмечает начало аргументов.

См. этот пост для деталей, и, возможно, этот для другого, более сложного,пример.

Примечание Комментарий спрашивает, как передать имя переменной (строка a), а не ее значение ($a). Это не кажется мне лучшим дизайном;если по какой-либо причине необходимо передать имя переменной, то имеет смысл сохранить , в переменной (var="a") и передать эту переменную, как указано выше.

Но если идея действительно заключается в том, чтобы передать само имя, тогда сделайте это вместо этого, так что либо из

perl -we'...' "a"
perl -we'...' -s -- -shv="a"

Остальное тоже самое, а %ENV использует переменную, которая получиланазначил входные данные.

Если используется полный Perl-скрипт (не однострочный), тогда используйте Getopt :: Long для удобной обработки фрагментов.


Комментарий просит передать имя переменной оболочки в переменную Perl - так что a из OP, а не ее значение $a. Я немного сомневаюсь в полезности этого, но это, конечно, возможно.

Два способа передачи переменной из оболочки в Perl отличаются тем, что передается.

...