Большинство других людей ответили на ваш вопрос хорошо. Взятые вместе, они создают очень полное объяснение проблемы и рекомендуемые обходные пути. Проблема заключается в том, что прагма Perl «константа использования» действительно создает подпрограмму в вашем текущем пакете, имя которой является первым аргументом прагмы, а значение - последним.
В Perl, после того, как подпрограмма объявлена, она может быть вызвана без скобок.
Понимая, что "константы" - это просто подпрограммы, вы можете понять, почему они не интерполируются в строках и почему оператор "жирная запятая" "=>", который цитирует левый аргумент, считает, что вы передали ему строку ( попробуйте другие встроенные функции, такие как time () и keys () с толстой запятой для дополнительного удовольствия).
К счастью, вы можете вызывать константу, используя явную пунктуацию, например, символ "Паренс" или "Амперсанд".
Однако у меня к вам вопрос: почему вы вообще используете константы для ключей хеша?
Я могу представить несколько сценариев, которые могут привести вас в этом направлении:
Вы хотите контролировать, какие ключи могут быть в хэше.
Вы хотите абстрагировать название ключей на случай, если они изменятся позже
В случае числа 1 константы, вероятно, не сохранят ваш хэш. Вместо этого рассмотрите возможность создания класса с общедоступными установщиками и получателями, которые заполняют хэш, видимый только для объекта. Это очень не похожее на Perl решение, но его очень легко сделать.
В случае с номером 2 я бы все еще решительно выступал за Класс. Если доступ к хешу регулируется через четко определенный интерфейс, только разработчик класса отвечает за правильность имен ключей хеша. В этом случае я бы не советовал использовать константы вообще.
Надеюсь, это поможет, и спасибо за ваше время.