Сохранение ключей среды Windows Perl ОБНОВЛЯЕТ их - PullRequest
3 голосов
/ 03 сентября 2008

У меня есть фреймворк, написанный на Perl, который устанавливает кучу переменных среды для поддержки межпроцессного (обычно это подпроцессного) взаимодействия. Мы храним наборы пар ключ / значение в XML-файлах. Мы постарались сделать имена ключей верблюжьими кейсом somethingLikeThis. Это все хорошо работает.

Недавно нам довелось передать управляющие (цепные) процессы из Windows в UNIX. Когда мы выплевываем хеш %ENV в файл из Windows, ключ somethingLikeThis становится SOMETHINGLIKETHIS. Когда процесс Unix берет файл и перезагружает среду и ищет значение $ENV{somethingLikeThis}, он не существует, поскольку в UNIX учитывается регистр (со стороны Windows тот же код работает нормально).

С тех пор мы вернулись и изменили все ключи для UPPERCASE и решили проблему, но это было утомительно и причиняло боль пользователям. Есть ли способ заставить Perl в Windows сохранить регистр символов ключей хэша среды?

Ответы [ 5 ]

3 голосов
/ 04 сентября 2008

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

2 голосов
/ 16 сентября 2008

Во-первых, чтобы решить вашу проблему, я считаю, что можно использовать обратные пометки вокруг набора и анализировать его самостоятельно. В моей системе Windows этот скрипт работал нормально.

my %env = map {/(.*?)=(.*)/;} `set`;
print join(' ', sort keys %env);

В книге верблюдов в главе 25 «Переносимый Perl», раздел «Взаимодействие с системой», приведен совет «Не зависите от конкретной переменной среды, существующей в% ENV, и не предполагайте, что что-то в% ENV будет иметь место». чувствительный или сохраняющий регистр. Не допускайте семантики наследования Unix для переменных среды; в некоторых системах они могут быть видны всем другим процессам. "

2 голосов
/ 03 сентября 2008

Насколько я помню, использование ALL_CAPS для переменных среды является рекомендуемой практикой в ​​мире Windows и * NIX. Я предполагаю, что Perl просто использует какой-то устаревший API для доступа к среде и, таким образом, получает только имя переменной в верхнем регистре.

В любом случае, вам никогда не следует полагаться на что-то подобное, даже более того, если вы просите своих пользователей установить переменные, просто представьте, сколько может вызвать ухудшение и замешательство простая переменная опечатки! Вы должны помнить, что некоторые операционные системы, которые останутся безымянными, еще не научились делать файлы, чувствительные к регистру ...

0 голосов
/ 09 сентября 2008

Насколько мне известно, нет. Возможно, вам лучше использовать другой хеш вместо% ENV. Если вы вызываете много внешних модулей и хотите отслеживать одни и те же переменные между ними, шаблон Factory может работать так, что вы не нарушаете DRY и можете использовать чувствительный к регистру хеш для нескольких модулей. Единственная хитрость заключается в том, чтобы эти переменные обновлялись во всех объектах фабрики, но я уверен, что вы можете решить эту проблему.

0 голосов
/ 06 сентября 2008

Джек М .: Согласен, это не проблема для Windows. Если я создаю переменную окружения Foo, я могу ссылаться на нее в Perl как $ ENV {FOO} или $ ENV {fOO} или $ ENV {foo}. Проблема заключается в следующем: я создаю его как Foo и выгружаю весь файл% ENV в файл, а затем считываю файл из * NX, чтобы воссоздать хэш среды, и использую тот же сценарий для ссылки на $ ENV {Foo}, значение этого хеша существует ($ ENV {FOO} существует).

Мы приняли весь обходной путь UPPERCASE, который предложил Дэвидг. Мне просто интересно, есть ли ЛЮБОЙ способ «сохранить регистр» при записи ключей к хешу% ENV из Perl в Windows.

...