现在禁止标量的实验值 - perl

时间:2016-12-16 21:16:41

标签: perl

旧软件中禁止使用标量的实验值:

$link = Winners::Links->new();
my @fields = $link->column_names;     
foreach my $field ( values @fields[0]) {

我试图制作:

 foreach my $field ( values {@fields[0]}) {

 foreach my $field ( values %{@fields[0]}) {

 foreach my $field ( values %@fields[0]) {

不是他们的作品。任何想法应该怎么做? THX。

以下是关于@fields对象定义的更多内容:

[[
  'id',
  'entry',
  'selection',
  'status'
]]

3 个答案:

答案 0 :(得分:13)

这是在Perl 5.14中添加的,但在5.23中删除了

  

标量上的实验%s现在被禁止(F)实验   Perl 5.14中添加的功能允许每个,键,推,弹出,移位,   splice,unshift和要用标量参数调用的值。这个   实验被认为是不成功的,并已被删除。该   postderef功能可以更好地满足您的需求。

因此,如果您在引用中使用它,请先取消引用它。有 由于你的原始代码,到达这里有些困惑:

foreach my $field ( values @fields[0]) {

这里@fields[0]实际上是一个切片,它是有效的,并且有效。但 严格和警告你会得到类似的东西:

Scalar value @fields[0] better written as $fields[0] at - line x.

事实上,如果你正在访问某个项目(比如参考,可能是你的 case)你应该使用$fields[0]代替。所以首先纠正一下, 然后取消引用以符合values的标准要求 (作为一个列表。它仅接受标量作为实验特征 过去)。

foreach my $field ( values %{$fields[0]})

答案 1 :(得分:7)

如果需要单个值而不是$ sigil,则使用@ sigil取消引用数组。

尝试使用:

foreach my $field ( values %{ $fields[0] } ) {
  ....
}

答案 2 :(得分:0)

我没有经过测试,但基于AoA参考的书面定义,我认为:

foreach my $field ( @{ $fields[0] } ) {...}