【问题标题】:Error for arrays in hash keys哈希键中的数组错误
【发布时间】:2013-11-02 07:12:11
【问题描述】:

我正在尝试在VALUES 中推送 2 个数组。一键,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

这也行不通。

【问题讨论】:

    标签: perl hash


    【解决方案1】:

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

    这完全取决于您希望最终数据结构是什么样子。我相信您正在寻找的是将与 %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 debugger(如果您熟悉如何使用它) ))。

    希望对你有帮助。

    【讨论】:

    • 非常感谢。那件事对我帮助很大。我正在使用 Dumper 检查我的错误。 :)
    【解决方案2】:

    你试过了吗?

    $hash{'one'} = ();
    push $hash{'one'},@array1;
    

    【讨论】:

    • @DeathMetal 您可以继续将数组附加到哈希值。
    • $hash{'one'} = () 是错误的。您不能将空列表分配给标量值。你想要[]
    • @TLP 编辑了答案。
    • @TLP 它可能看起来很奇怪,但你可以并且结果是 undef 在标量上下文中。 perl -Mstrict -we 'my $x = ();'
    • @TLP 看起来像是新的候选问题。我个人会区分you can't do itit doesn't make sense 类别。
    【解决方案3】:

    简单:

    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' ] };

    【讨论】:

      【解决方案4】:

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

      你可以,

      $hash{'one'} = [] if ref($hash{'one'}) ne "ARRAY";
      push @{$hash{'one'}}, [ @array1 ];
      

      【讨论】:

      • ohh.. 该死的.. 我不能替换这些值吗?
      • 我可以在上面的帮助下推送数组。非常感谢。但是在打印的时候,我只能看到array1's cherryarray2's orange
      猜你喜欢
      • 1970-01-01
      • 2013-03-22
      • 2016-01-20
      • 2012-05-13
      • 1970-01-01
      • 1970-01-01
      • 2012-08-17
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多