我在perl哈希中有一个数组,声明如下:
my %updatevars = (datapoints => []);
我后来试图像这样添加元素:
push($updatevars{'datapoints'}, [$updatestart+$i, $bandwidth]);
我收到此错误:
要推送的arg 1的类型必须是dirlist.pl第61行的数组(不是哈希元素),靠近“])”
答案 0 :(得分:6)
哈希(和数组)只能包含标量。这就是我们必须在其中引用数组(和哈希)的原因。 $updatevars{datapoints}
包含对数组的引用。因此,您需要使用
push @{ $updatevars{datapoints} }, [ $updatestart+$i, $bandwidth ];
请注意,您的代码适用于5.14+,因为push
已更改为也接受引用。 (但这种变化“被认为是高度实验性的”,因此您也应该在新版本中使用上述代码。)
答案 1 :(得分:3)
$updatevars{'datapoints'}
是一个数组引用,正如您指定的那样:[]
。 push
将数组作为参数,而不是数组引用。所以你需要取消引用你的参考:
push @{ $updatevars{'datapoints'} }, ...
在Perl v5.14中,您可以使用引用,如文档中所述。但这听起来并不像是推荐的做法。
从Perl 5.14开始,“push”可以采用标量EXPR,必须使用 保持对未经处理的数组的引用。争论将是 自动解除引用。这种“推动”方面被认为是高度的 实验。确切的行为可能会在将来的版本中发生变化 的Perl。
答案 2 :(得分:2)
试试这个:
push @{$updatevars{'datapoints'}}, [$updatestart+$i, $bandwidth];
由于push
采用数组且$updatevars{'datapoints'}
是数组引用,因此您必须将@{}
放在前面来取消引用它。