Сохранение ключей среды Perl Windows делает их UPCASES их

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

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

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

Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
3
0
806
5

Ответы 5

Насколько я помню, использование 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 для переменных среды; в некоторых системах они могут быть видимы для всех других процессов ".

Другие вопросы по теме