2009-02-03 38 views
4

我有为MSWin32-x86构建的perl,v5.6.1 - 多线程二进制版本638由ActiveState提供。为什么Perl在用constant.pm使用散列引用时会抱怨?

我正在处理一个Perl脚本,我已经声明了稍后用于比较的常量。出于某种原因,我得到一个错误,指出沿着常量名称行在脚本行31(在下面的代码中使用常量子句后面的行)有无效字符。我检查并发现常量名中的'_'(下划线)是一个合法的字符。我也尝试将'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提供恒定的版本不支持散列引用。

SOLUTION:

使用常量的常规声明。因此,该声明如下所示:

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版本到支持散列引用声明常量。

+0

如果删除最后一个逗号,会发生什么情况? – 2009-02-03 18:26:23

+0

哪个版本的Perl?你的代码在Perl 5.8.8上可以正常工作。如果您的示例从第30行开始,那么可能错误位于您粘贴的小部分代码之上。 – 2009-02-03 18:26:26

+0

我只是将常量声明部分移动到测试脚本并运行该脚本,但仍然出现错误。我在Windows XP中运行ActivePerl有没有关系?如果它在为你运行,那对我来说可能是一个环境问题。 – tundal45 2009-02-03 18:33:19

回答

13

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

0

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

-3

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

PCT_THRES_CUST => 3, 

这可能是问题。

3

它在perl5.8上正常工作,但在perl5.6上不起作用。该错误信息是:

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

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

3

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

use constant MAX_NET_DLR => 99.99; 
1

我会使用Readonly模块。

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

只读可以用来声明标量,数组和哈希只读(实常量)。

相关问题