Perl 5.26.1中‘Experimental values on scalar’错误的排查与修复
问题根源
这个报错其实是Perl版本迭代带来的特性移除导致的:
values函数的标准用法是作用于哈希,用来获取哈希中所有值的列表;- 你的
$::c{slaves}是一个哈希引用(从你给出的结构$VAR1 = { 'slaves' => { '48' => '10.10.10.48' }, };能明确看出来,它是指向一个哈希的标量变量); - 早期Perl(比如5.20系列)有个实验性特性,允许对哈希/数组引用直接使用
values/keys/each这类函数,但这个实验特性在Perl 5.26版本被正式禁止了,所以会抛出Experimental values on scalar is now forbidden的错误。
修复方法
有两种可靠的修复方式,任选其一即可:
方式一:显式解引用哈希引用(兼容性最好)
把哈希引用强制解引用为哈希,再传给values函数,修改后的代码如下:
foreach my $slave (values %{ $::c{slaves} }) { ... }
%{ ... }是Perl里的哈希解引用语法,它会把括号内的哈希引用转换成普通哈希,让values能正常工作,这种写法在所有支持哈希引用的Perl版本里都能运行。
方式二:使用后向解引用语法(更简洁)
如果你的Perl版本是5.24及以上(你的5.26.1满足要求),可以使用Perl引入的后向解引用特性,写法更简洁:
foreach my $slave (values $::c{slaves}->%*) { ... }
->%*是哈希引用的后向解引用操作符,专门用来直接从引用中获取哈希的内容,语法更直观,代码也更短。
两种方式最终都能正确遍历到$::c{slaves}哈希里的10.10.10.48这个值,解决报错问题。
内容的提问来源于stack exchange,提问作者Sandra Schlichting
相关产品推荐
相关产品推荐

