Почему Perl жалуется, когда я использую хеш-ссылку с constant.pm? - PullRequest
4 голосов
/ 03 февраля 2009

У меня есть perl, v5.6.1, собранный для многопоточной MSWin32-x86-x86-битной сборки 638, предоставляемой ActiveState.

Я работаю над сценарием Perl, в котором я объявил константы, которые позже используются для сравнения. По какой-то причине я получаю сообщение об ошибке, в котором говорится, что что-то в строке имени константы содержит недопустимые символы в строке 31 скрипта (строка сразу после предложения use constant в приведенном ниже коде). Я проверил и обнаружил, что '_' (подчеркивание) в имени константы является допустимым символом. Я также попытался изменить «0,00» на «0», чтобы увидеть, не в этом ли причина, но я получил ту же ошибку. Я не уверен, что я делаю неправильно. Кто-нибудь знает, почему компилятору это не нравится?

Спасибо!

Вот код:

use constant {
MIN_NET_DLR => 0.00,
MAX_NET_DLR => 99.99,
MIN_SUM_DLR => 0.00,
MAX_SUM_DLR => 999.99,
MIN_UNITS => 0,
MAX_UNITS => 99,
MIN_SUM_UNITS => 0,
MAX_SUM_UNITS => 999,
PCT_THRES_AO => 1,
PCT_THRES_TRANS_CUST_BI => 20,
PCT_THRES_CUST => 3,
};

ПРОБЛЕМА:

Проблема в том, что версия константы, предоставляемая perl 5.6.1, не поддерживает хеш-ссылку.

РЕШЕНИЕ:

Используйте регулярное объявление для констант. Следовательно, декларация будет выглядеть следующим образом:

use constant MIN_NET_DLR => 0.00;
use constant MAX_NET_DLR => 99.99;
use constant MIN_SUM_DLR => 0.00;
use constant MAX_SUM_DLR => 999.99;
use constant MIN_UNITS => 0;
use constant MAX_UNITS => 99;
use constant MIN_SUM_UNITS => 0;
use constant MAX_SUM_UNITS => 999;
use constant PCT_THRES_AO =>    1;
use constant PCT_THRES_TRANS_CUST_BI => 20;
use constant PCT_THRES_CUST => 3;

Спасибо @leon за решение, а также другим, кто поделился своим мнением.

ОБНОВЛЕНИЕ: Другое (более элегантное) решение - обновить версию Perl до версии, которая поддерживает ссылку на хэш при объявлении констант.

Ответы [ 6 ]

13 голосов
/ 03 февраля 2009

Проблема в том, что вы используете ссылку на хеш. Версия constant, предоставляемая perl 5.6.1, не поддерживает это. Вам придется либо снять скобки, либо обновить constant.

3 голосов
/ 04 февраля 2009

Ваш старый Perl, вероятно, не поддерживает синтаксис, в котором вы объявляете несколько констант в одном операторе. Попробуйте определить каждую константу отдельно, как это ...

use constant MAX_NET_DLR => 99.99;
3 голосов
/ 03 февраля 2009

У меня отлично работает на perl5.8, но не работает на perl5.6. Сообщение об ошибке:

Невозможно определить «HASH (0x80c05d8)» как константу (имя содержит недопустимые символы или пусто)

Похоже, проблема старой версии, вероятно, проблема, которую Леон описал .

1 голос
/ 04 апреля 2009

Я бы использовал модуль Readonly .

Недостатком константы является то, что она создает функцию в пространстве имен вызывающих, которая возвращает константу.

Readonly может использоваться для объявления скаляров, массивов и хэшей только для чтения (реальные константы).

0 голосов
/ 03 февраля 2009

Удалить последнюю запятую в конце этой строки:

PCT_THRES_CUST => 3,

Это может быть проблемой.

0 голосов
/ 03 февраля 2009

У меня работает. Вы уверены, что в этом коде где-то нет управляющих символов?

...