0

我正在尝试将 2 个数组推入VALUES. 一键,2个值---> 2个值在我的情况下是数组

my %hash

%hash{'one'} -->> is my key in hash

my @array1= ('apple', 'banana', 'orange');

my @array2 =('banana', 'orange','papaya','cherry');

我坚持将这些数组放入我的哈希键

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

4 回答 4

2

你试过这个吗?

$hash{'one'} = ();
push $hash{'one'},@array1;
于 2013-11-02T07:18:44.717 回答
2

我认为这里可能有些混乱(无论是你还是我,我都说不清是哪一个)。

这完全取决于您希望最终数据结构是什么样子。我相信您正在寻找的是将与 %hash 的键“一个”关联的值作为具有两个元素的数组引用,每个元素本身都是数组引用,如下所示:

# 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 调试器(如果您熟悉如何使用它的话))。

我希望这会有所帮助。

于 2013-11-02T17:59:56.973 回答
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'
                   ]
        };

于 2013-11-04T02:53:08.337 回答
1

$hash{'one'}已经具有标量值1,不能像您的代码建议的那样用作数组引用。

你可以,

$hash{'one'} = [] if ref($hash{'one'}) ne "ARRAY";
push @{$hash{'one'}}, [ @array1 ];
于 2013-11-02T07:16:22.103 回答