Сохранение ключей Perl Windows Environment UPCASES их

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

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

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


person Community    schedule 02.09.2008    source источник


Ответы (5)


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

person Jack M.    schedule 03.09.2008

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

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

person dguaraglia    schedule 03.09.2008

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

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

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

person piCookie    schedule 16.09.2008

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

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

person Community    schedule 06.09.2008

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

person Jack M.    schedule 09.09.2008