У меня есть фреймворк, написанный на Perl, который устанавливает кучу переменных среды для поддержки межпроцессного взаимодействия (обычно это подпроцесс). Мы храним наборы пар ключ / значение в XML-файлах. Мы постарались сделать ключевые названия Camel-case somethingLikeThis. Все это хорошо работает.
Недавно нам довелось передавать управляющие (цепочные) процессы из Windows в UNIX. Когда мы выдаем хеш %ENV файлу из Windows, ключ somethingLikeThis становится SOMETHINGLIKETHIS. Когда процесс Unix берет файл, перезагружает среду и ищет значение $ENV{somethingLikeThis}, его не существует, поскольку UNIX чувствителен к регистру (со стороны Windows тот же код работает нормально).
С тех пор мы вернулись и изменили все ключи на ВЕРХНИЙ РЕГИСТР и решили проблему, но это было утомительно и причиняло боль пользователям. Есть ли способ заставить Perl в Windows сохранять регистр символов ключей хэша среды?





Насколько я помню, использование ALL_CAPS для переменных среды является рекомендуемой практикой как в Windows, так и в * NIX. Я предполагаю, что Perl просто использует какой-то устаревший API для доступа к среде и, таким образом, извлекает только имя переменной в верхнем регистре.
В любом случае, вы никогда не должны полагаться на что-то подобное, тем более, если вы просите своих пользователей установить переменные, просто представьте, сколько раздражения и путаницы может вызвать простая переменная с ошибкой! Вы должны помнить, что некоторые операционные системы, которые останутся безымянными, еще не научились делать файлы с учетом регистра ...
Я считаю, что вы обнаружите, что переменные среды Windows на самом деле нечувствительны к регистру, поэтому ключи вводятся в верхнем регистре, чтобы избежать путаницы. Таким образом, сценарии Windows, не имеющие никакого понятия о чувствительности к регистру, могут использовать те же переменные, что и все остальное.
Джек М .: Согласен, для Windows это не проблема. Если я создаю переменную окружения Foo, я могу ссылаться на нее в Perl как на $ ENV {FOO}, $ ENV {fOO} или $ ENV {foo}. Проблема в том, что я создаю его как Foo и выгружаю весь% ENV в файл, а затем читаю файл из * NX, чтобы воссоздать хэш среды и использовать тот же сценарий для ссылки на $ ENV {Foo}, это хеш-значение не существует (существует $ ENV {FOO}).
Мы приняли все обходные пути ЗАПИСИ, предложенные Дэвидом. Мне просто было интересно, есть ли ЛЮБОЙ способ «сохранить регистр» при записи ключей к хешу% ENV из Perl в Windows.
Насколько мне известно, нет. Похоже, вам может быть лучше использовать другой хеш вместо% ENV. Если вы вызываете множество внешних модулей и хотите отслеживать в них одни и те же переменные, шаблон Factory может работать, так что вы не нарушите DRY и сможете использовать хеш-код с учетом регистра в нескольких модулях. Единственный трюк тогда будет заключаться в том, чтобы обновлять эти переменные для всех объектов Factory, но я уверен, что вы справитесь с этим.
Во-первых, чтобы решить вашу проблему, я считаю, что использование обратных кавычек вокруг набора и его самостоятельный анализ сработают. В моей системе Windows этот сценарий работал нормально.
my %env = map {/(.*?)=(.*)/;} `set`;
print join(' ', sort keys %env);
В книге верблюда совет в главе 25: Portable Perl, раздел System Interaction: «Не полагайтесь на конкретную переменную среды, существующую в% ENV, и не предполагайте, что что-либо в% ENV будет чувствительно к регистру или регистру». сохранение. Не предполагайте семантику наследования Unix для переменных среды; в некоторых системах они могут быть видимы для всех других процессов ".