4

我有 perl, v5.6.1 为 ActiveState 提供的 MSWin32-x86-multi-thread Binary build 638 构建。

我正在编写一个 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 提供的常量版本不支持哈希引用。

解决方案:

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

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 版本更新为在声明常量时支持散列引用的版本。

4

6 回答 6

13

问题是您使用的是哈希引用。perl 5.6.1 提供的版本constant不支持。您要么必须移除大括号,要么升级您的constant.

于 2009-02-03T18:39:07.107 回答
3

它在 perl5.8 上对我来说很好,但在 perl5.6 上不起作用。错误信息是:

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

似乎是一个旧版本的问题,可能是 Leon描述的问题。

于 2009-02-03T18:41:21.440 回答
3

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

use constant MAX_NET_DLR => 99.99;
于 2009-02-04T00:46:20.127 回答
1

我会使用Readonly模块。

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

Readonly 可用于声明标量、数组和哈希只读(实常数)。

于 2009-04-04T15:32:28.000 回答
0

为我工作。您确定该代码中的某处没有任何控制字符吗?

于 2009-02-03T18:26:01.533 回答
-3

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

PCT_THRES_CUST => 3,

这可能是问题所在。

于 2009-02-03T18:38:35.003 回答