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

问题描述 投票:0回答:7

我有 ActiveState 提供的为 MSWin32-x86-多线程二进制版本 638 构建的 perl v5.6.1。

我正在编写一个 Perl 脚本,我在其中声明了稍后用于比较目的的常量。由于某种原因,我收到一个错误,指出 Constant name 行中的某些内容在脚本的第 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提供的constant版本不支持hash引用。

解决方案:

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

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

perl constants
7个回答
13
投票

问题在于您正在使用哈希引用。 perl 5.6.1 提供的

constant
版本不支持该功能。您要么必须取下牙套,要么升级您的
constant


3
投票

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

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

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


3
投票

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

use constant MAX_NET_DLR => 99.99;

1
投票

我会使用Readonly模块。

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

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


0
投票

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


0
投票

我很惊讶没有人建议这样做(这有点难看,我实际上用 Perl 5.18.2 测试了它):

use constant HASH => {
    a => 1,
    b => 2
};

BEGIN {
    while (my ($n, $v) = each %{(HASH)}) {
        eval "use constant $n => $v";
    }
}

对于长长的常量列表,这可能是值得的,但截至今天,无论如何,这都是历史性的。


-3
投票

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

PCT_THRES_CUST => 3,

这可能是问题所在。

© www.soinside.com 2019 - 2024. All rights reserved.