Доступ к переменным среды (оболочки) Perl в Windows — $ENV не работает

Проблема

Я узнал, как использовать переменные среды Windows (например, %AppData%, %HomePath%, %SystemRoot% и т. д.) в этом сообщении SO:

Получение пути %AppData% в Perl-скрипте

Вот фрагмент кода, который был выбран в качестве рабочего правильного ответа:

 #!/usr/bin/perl

 use warnings;
 use strict;

 my $localConfPath = $ENV{localappdata};
 my $appdata = $ENV{appdata}; 

 print $localConfPath;  #will print the app path - C:\users\xxx\AppData\local
 print $appdata; #prints - C:\users\xxx\AppData\Roaming

Однако по какой-то причине это не работает на моей машине в моем коде. Мои сценарии работают без строки shebang (#!), поэтому я пробовал сценарий как с ней, так и без нее, но безрезультатно.

Моя установка

Я использую Perl, поставляемый с GitBash, если это имеет значение.

Что я пробовал

Я попробовал простое выполнение командной строки Perl:

perl -e 'print %ENV{AppData}';

Это не сработало. Я также пробовал следующие альтернативы:

perl -e 'print %ENV{APPDATA}';
perl -e 'print %ENV{appdata}';

Это тоже не сработало. Вот ошибка, которую я получаю (одинаковая для всех трех версий):

syntax error at -e line 1, near "%ENV{AppData"
Execution of -e aborted due to compilation errors.

Я даже пытался использовать код из сообщения SO, которое я упомянул в своем собственном файле. Этот код тоже не работает. С кодом из сообщения я получаю эту ошибку:

$ perl /c/Users/User1/Desktop/ehCode_testingWindowsEnvironmentVariables_01.pl
Use of uninitialized value in print at /c/Users/User1/Desktop/ehCode_testingWindowsEnvironmentVariables_01.pl line 7.
Use of uninitialized value in print at /c/Users/User1/Desktop/ehCode_testingWindowsEnvironmentVariables_01.pl line 8.

Тогда речь идет о следующих строках:

print $localConfPath;  #will print the app path - C:\users\xxx\AppData\local
print $appdata; #prints - C:\users\xxx\AppData\Roaming

Я не понимаю, почему они не должны работать.

Я проверил Perl Monks, Perl Maven, Stack Overflow и другие популярные ресурсы Perl, но безрезультатно. Даже у Active State не было ответа.


person Eric Hepperle - CodeSlayer2010    schedule 13.02.2017    source источник
comment
Обратите внимание, что это $ENV{...}, а не %ENV{...} при попытке доступа к отдельным элементам в хеше.   -  person stevieb    schedule 13.02.2017
comment
Кроме того, для однострочников в Windows обычно необходимо использовать двойные кавычки: perl -E "...". Я никогда раньше не использовал git bash, так что это может быть неприменимо.   -  person stevieb    schedule 13.02.2017
comment
Дох! Спасибо @stevieb ... Это была проблема. Все остальное было в порядке. $ perl -e 'print $ENV{APPDATA}'; работает отлично.   -  person Eric Hepperle - CodeSlayer2010    schedule 13.02.2017
comment
Я сделал это ответом, так как он решил проблему.   -  person stevieb    schedule 13.02.2017
comment
@stevieb, это зависит от оболочки, а не от Perl. Если он использует bash, то одинарные кавычки были уместны.   -  person ikegami    schedule 13.02.2017
comment
@ikegami Спасибо. Я знаю, что это оболочка, но никогда раньше не использовал git bash, я не был уверен, была ли это настоящая оболочка bash или какая-то хитрость все еще завернута в оболочку Windows cmd.exe или нет.   -  person stevieb    schedule 13.02.2017
comment
Это не было бы bash, если бы оно не принимало команды bash.   -  person ikegami    schedule 13.02.2017


Ответы (1)


Когда вы получаете доступ к отдельным элементам хеша, вам нужно использовать скалярный сигил $, а не сигил хэша %:

perl -e 'print $ENV{APPDATA}'
person stevieb    schedule 13.02.2017
comment
Кроме того, для тех, кто видит, что этот ответ помечен правильно, следует помнить еще о том, что Windows использует ВСЕ ЗАГЛАВНЫЕ БУКВЫ и учитывает регистр (для ключа решетки). - person Eric Hepperle - CodeSlayer2010; 13.02.2017
comment
@EricHepperle-CodeSlayer2010 только что провел небольшое тестирование. В cmd.exe переменные env не чувствительны к регистру. appdata прекрасно работает, как и programfiles (для ProgramFiles). Вероятно, оболочка bash заставляет вещи оставаться в здравом уме, используя правильный регистр (хотя я не могу это подтвердить). - person stevieb; 13.02.2017
comment
Спасибо @stevieb, я посмотрю на это. - person Eric Hepperle - CodeSlayer2010; 17.03.2017