如何修复"标量上的实验值现在被禁止"

San*_*ing 2 perl

在Perl 5.26.1中,我得到:

现在,在/funcx.pm第110行禁止标量的实验值.

第110行是foreach in

sub checkSsh {
    foreach my $slave (values $::c{slaves}) {
      ...
    }
}
Run Code Online (Sandbox Code Playgroud)

$c 包含

$VAR1 = {
          'slaves' => {
                        '48' => '10.10.10.48'
                      },
        };
Run Code Online (Sandbox Code Playgroud)

哪里

our %c = %{YAML::Syck::LoadFile($config)};
Run Code Online (Sandbox Code Playgroud)

究竟是什么问题?它应该如何修复?

Hun*_*len 6

Perl抱怨你values在SCALAR上调用内置函数,在本例中是一个HASHREF:

正确取消引用您的slaves密钥可以values按预期工作:

foreach my $slave ( values %{ $c{slaves} } ) {
  ...
}
Run Code Online (Sandbox Code Playgroud)

至于您收到的具体警告,它们直接在perldoc页面中解决:

从Perl 5.14开始,一个实验性功能允许值采用标量表达式.该实验被认为是不成功的,并且从Perl 5.24开始被删除.

为了避免让运行早期版本Perl的代码的潜在用户感到困惑,并且出现了神秘的语法错误,请将这类内容置于文件的顶部,以表明您的代码仅适用于最近一个年份的Perls:

use 5.012;  # so keys/values/each work on arrays
Run Code Online (Sandbox Code Playgroud)

  • 只是为了进一步混淆问题,提问者也可以使用后缀解除引用形式`values $ x - >%*`,如[perldoc](https://perldoc.perl.org/perlref.html#Postfix-Dereference-Syntax )因为他们使用的是Perl> = 5.20. (2认同)