我正在尝试在VALUES
中推送2个数组。一键,2个值--->在我的情况下,2个值是数组
my %hash
%hash{'one'} -->> is my key in hash
my @array1= ('apple', 'banana', 'orange');
my @array2 =('banana', 'orange','papaya','cherry');
我被困在把这些数组放到我的hashkey
push @{$hash{'one'}}, [ @array1 ]
push @{$hash{'one'}}, [ @array2 ]
当我尝试运行该程序时,出现错误:can't use string ("1") as an ARRAY ref while "stricts refs"
如果我将代码更改为:
@{$hash{'one'}}= \@array1
@{$hash{'one'}}= \@array2
这也行不通。
答案 0 :(得分:2)
$hash{'one'} = ();
push $hash{'one'},@array1;
答案 1 :(得分:2)
我认为这里可能存在一些混淆(无论是你,还是我,我都不知道哪一个)。
这完全取决于您希望最终数据结构的样子。我相信你要找的是将与%hash的键'one'相关联的值作为带有两个元素的数组引用,每个元素本身都是数组引用,如下所示:
# We'll call this "STRUCT-ONE"
%hash = (
'one' => [
['apple', 'banana', 'orange'],
['banana', 'orange','papaya','cherry'],
],
);
...或者,或许您打算只有一个数组引用作为值,如下所示:
# Let's call this "STRUCT=TWO"
%hash = (
'one' => [
['apple', 'banana', 'orange', 'banana', 'orange','papaya','cherry'],
],
);
根据您正在寻找的上述内容,填充每个结构的语法会有所不同。
对于每个结果,您将以相同的方式初始化您的值:
my %hash = ();
my @array1= ('apple', 'banana', 'orange');
my @array2 =('banana', 'orange','papaya','cherry');
...而且,对于“STRUCT-ONE”,你会写一些类似的东西:
$hash{'one'} = [];
push(@{$hash{'one'}}, [@array1]);
push(@{$hash{'one'}}, [@array2]);
...或者,最后两行可以这样组合:
push(@{$hash{'one'}}, [@array1], [@array2]);
或者,对于上面的“STRUCT-TWO”,您可以将其更改为:
push(@{$hash{'one'}}, @array1, @array2);
(请注意,我只是删除了'[]'的匿名数组引用语法。)
最后一条评论......你会注意到我使用'[@ array1]'来创建一个新的匿名数组引用(并用现有数组的内容填充它(基本上执行数组内容的副本) )而不是使用反斜杠'\ @ array1'引用现有数组。您选择哪个选项取决于您的真实意图。我之所以选择前者,那么你就有了一个独立的数据结构(因此对@ array1或@ array2的进一步修改不会影响你的%hash内容。但是,如果你有一个非常大的数组并且不想复制它内存(你知道内容真的是不可变的),然后对现有数组的引用可能是更好的选择。
最后,我建议使用Data::Dumper作为诊断工具来检查数据结构的实际外观(或Perl debugger的明智使用(如果您熟悉的话)如何使用))。
我希望有所帮助。
答案 2 :(得分:2)
简单:
use Data::Dumper;
my @array1 = ('apple', 'banana', 'orange');
my @array2 =('banana', 'orange','papaya','cherry');
my %hash;
$hash{one} = [@array1];
push(@{ $hash{one} }, @array2);
print Dumper(\%hash);
输出
$VAR1 = {
'one' => [
'apple',
'banana',
'orange',
'banana',
'orange',
'papaya',
'cherry'
]
};
答案 3 :(得分:1)
$hash{'one'}
已有标量值1
,无法用作代码建议的数组引用。
你可以,
$hash{'one'} = [] if ref($hash{'one'}) ne "ARRAY";
push @{$hash{'one'}}, [ @array1 ];