2008-09-02 1 views
3

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

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

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

ответ

2

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

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

3

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

0

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

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

0

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

2

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

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

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

Смежные вопросы