散列键中的数组出错

时间:2013-11-02 07:12:12

标签: perl hash

我正在尝试在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

这也行不通。

4 个答案:

答案 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 ];