Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/file/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
当我对constant.pm使用哈希引用时,为什么Perl会抱怨?_Perl_Constants - Fatal编程技术网

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

当我对constant.pm使用哈希引用时,为什么Perl会抱怨?,perl,constants,Perl,Constants,我已经为ActiveState提供的MSWin32-x86-multi-thread Binary build 638构建了perl v5.6.1 我正在编写一个Perl脚本,在该脚本中我声明了稍后用于比较目的的常量。出于某种原因,我得到了一个错误,指出常量名称行中的某些内容在脚本的第31行(下面代码中use Constant子句后面的那行)有无效字符。我检查了一下,发现常量名中的“u”(下划线)是一个合法字符。我还尝试将“0.00”更改为“0”,以查看这是否是原因,但我得到了相同的错误。我不确

我已经为ActiveState提供的MSWin32-x86-multi-thread Binary build 638构建了perl v5.6.1

我正在编写一个Perl脚本,在该脚本中我声明了稍后用于比较目的的常量。出于某种原因,我得到了一个错误,指出常量名称行中的某些内容在脚本的第31行(下面代码中use Constant子句后面的那行)有无效字符。我检查了一下,发现常量名中的“u”(下划线)是一个合法字符。我还尝试将“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版本更新为一个在声明常量时支持哈希引用的版本。

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

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

PCT_THRES_CUST => 3,

这可能就是问题所在。

问题在于您使用的是散列引用。perl 5.6.1提供的
constant
版本不支持这一点。你要么移除大括号,要么升级你的
常量

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

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


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

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

use constant MAX_NET_DLR => 99.99;
我会使用这个模块

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


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

如果删除最后一个逗号,会发生什么情况?哪个版本的Perl?您的代码在Perl 5.8.8上运行良好。如果您的示例从第30行开始,那么错误可能位于粘贴的一小段代码之上。我将常量声明部分移到了测试脚本中,并运行了该脚本,但仍然得到了错误。在Windows XP中运行ActivePerl是否重要?如果它是为您运行的,对我来说可能是一个环境问题。它在WinXp上与ActivePerl配合使用效果很好。我为ActiveState Corp提供的MSWin32-x86-multi-thread Binary build 638构建了perl,v5.6.1。我将常量声明部分移到了测试脚本中,并运行了该脚本,但仍然出现了错误。在Windows XP中运行ActivePerl是否重要?如果它是为您运行的,对我来说可能是一个环境问题。可能-我是在linux上测试的。那里一直允许逗号。Perl允许在列表中拖尾逗号。谢谢Leon,谢谢所有参与帮助的人。问题是我使用的是散列引用。一旦我在前面声明了每个常数和use常量,它就消失了。一个更好的解决方案当然是升级,但我有几个脚本正在运行,所以不得不等待。谢谢或者用括号代替hashref创建一个真正的散列。@noshonky-谢谢。我昨天试过了,效果很好。我将用答案更新这个问题。在使用Readonly时,注意散列和数组的性能影响也很重要(如果您有Readonly::XS,标量就可以了)。此外,由常量创建的常量可以在编译时解析为“sleep(60*WAIT_MINUTES);”或“debug($str)if debug;”等表达式