在hashref中取消引用标量引用

时间:2011-01-26 01:50:12

标签: perl reference

我有一个带有arrayrefs和scalarrefs的hashref作为值。我可以访问arrayrefs的值,但不能访问标量引用。


foreach (keys %$data) {
  if (ref $data->{$_} eq 'ARRAY') { 
    push @values, $data->{$_}[0];
  }
  elsif (ref $data->{$_} eq 'SCALAR') { 
    push @values, $data->???
  }
}

我该怎么做?

2 个答案:

答案 0 :(得分:7)

要取消引用标量引用,只需在值前加上标量符号$

if (ref $data->{$_} eq 'SCALAR') { 
    push @values, ${$data->{$_}};
}

您的arrayref情况不太正确,因为您要取消引用第一个arrayref 元素,而不是获取数组的所有元素。但是,由于您正在存储标量,因此无法存储所有arrayref的值,除非您以某种方式将它们转换为标量 - 例如,获取该arrayref中的元素数量(这是您在评估时获得的元素数量)标量上下文中的数组),或者将所有数组元素连接成一个字符串。

请参阅perldoc perlref

  

使用参考资料

     
      
  1. 在您将标识符(或标识符链)作为变量或子例程名称的一部分放置的任何地方,您可以使用包含正确类型引用的简单标量变量替换标识符:
  2.         

    $bar = $$scalarref;
    push(@$arrayref, $filename);
    $$arrayref[0] = "January";
    $$hashref{"KEY"} = "VALUE";
    &$coderef(1,2,3);
    print $globref "output\n";
    
         

    重要的是要了解我们特别没有解除引用$ arrayref [0]或$ hashref {“KEY”}。标量变量的取消引用在进行任何键查找之前发生。比简单标量变量更复杂的必须使用方法2或3 [下面]。但是,“简单标量”包括一个本身使用方法1递归的标识符。因此,以下打印“你好”。

    $refrefref = \\\"howdy";
    print $$$$refrefref;
    

答案 1 :(得分:1)

如果您只关注%$data的值,则可以循环使用它们而不是键:

for my $value (values %$data) {
    if (ref $value eq 'ARRAY') {
        push @values, $value->[0];
    } elsif (ref $value eq 'SCALAR') {
        push @values, $$value;
    }
}

更简洁,更易读,恕我直言。