当我使用带有constant.pm的哈希引用时,为什么Perl会抱怨?

时间:2009-02-03 18:22:18

标签: perl constants

我有perl,v5.6.1为ActiveState提供的MSWin32-x86-multi-thread二进制版本638构建。

我正在处理一个Perl脚本,其中我声明了以后用于比较目的的常量。由于某种原因,我收到一个错误,指出常量名称行中的某些内容在脚本的第31行(在下面的代码中使用常量子句后面的行)中有无效字符。我检查并发现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 个答案:

答案 0 :(得分:13)

问题是您正在使用哈希引用。 perl 5.6.1提供的constant版本不支持此版本。您必须删除大括号或升级constant

答案 1 :(得分:3)

在perl5.8上它适用于我,但在perl5.6上不起作用。错误消息是:

  

无法将“HASH(0x80c05d8)”定义为常量(名称包含无效字符或为空)

似乎是旧版本的问题,可能是Leon described的问题。

答案 2 :(得分:3)

您的旧perl可能不支持在一个语句中声明多个常量的语法。尝试分别定义每个常量...

use constant MAX_NET_DLR => 99.99;

答案 3 :(得分:1)

我会使用Readonly模块。

常量的缺点是,它在调用者命名空间中创建一个返回常量值的函数。

Readonly可用于声明scalars,数组和哈希readonly(实常数)。

答案 4 :(得分:0)

适合我。你确定你的代码中没有任何控制字符吗?

答案 5 :(得分:-3)

删除此行末尾的最后一个逗号:

PCT_THRES_CUST => 3,

这可能就是问题所在。