我有一个带有arrayrefs和scalarrefs的hashref作为值。我可以访问arrayrefs的值,但不能访问标量引用。
foreach (keys %$data) {
if (ref $data->{$_} eq 'ARRAY') {
push @values, $data->{$_}[0];
}
elsif (ref $data->{$_} eq 'SCALAR') {
push @values, $data->???
}
}
我该怎么做?
答案 0 :(得分:7)
要取消引用标量引用,只需在值前加上标量符号$
:
if (ref $data->{$_} eq 'SCALAR') {
push @values, ${$data->{$_}};
}
您的arrayref情况不太正确,因为您要取消引用第一个arrayref 元素,而不是获取数组的所有元素。但是,由于您正在存储标量,因此无法存储所有arrayref的值,除非您以某种方式将它们转换为标量 - 例如,获取该arrayref中的元素数量(这是您在评估时获得的元素数量)标量上下文中的数组),或者将所有数组元素连接成一个字符串。
请参阅perldoc perlref:
使用参考资料
- 在您将标识符(或标识符链)作为变量或子例程名称的一部分放置的任何地方,您可以使用包含正确类型引用的简单标量变量替换标识符:
醇>
$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;
}
}
更简洁,更易读,恕我直言。