【问题标题】:In Perl how do you create and use an array of hashes?在 Perl 中,如何创建和使用散列数组?
【发布时间】:2010-09-01 07:25:26
【问题描述】:

如何做一个 Perl 程序包含一个数组并且该数组指向一个哈希?

就是这个样子,

(M1)        (M2)        ...it goes on
 |--k1=>v1   |--K1=>v1
 |--k2=>v2   |--k2=>v2

我应该访问该数组M1,然后访问它包含的哈希值。 (等等)...

【问题讨论】:

标签: arrays perl hash


【解决方案1】:

应该这样做 - 虽然我不太清楚您希望“M1”和“M2”如何在场景中发挥作用:

my(@array) = ( { k1 => "v1", k2 => "v2" }, { K1 => "V1", K2 => "V2" } );

print "$array[0]->{k1}\n";
print "$array[1]->{K2}\n";

当您在数组的不同元素中使用不同的键集(k1 和 k2 与 K1 和 K2)时,您的生活会变得更加有趣。这远非禁止,但它使处理变得更加困难。

【讨论】:

  • 如果一个键包含另一个哈希(键和值),那么上面的代码 sn-p 会是什么样子???
  • @Senthil kumar 密钥不能包含哈希;一个键是一个字符串。只有值可以是对散列或数组的引用。如果您尝试将引用存储到键中,它将被转换为无法转换回引用的字符串(如"HASH(0x8d4bc28)")。
  • @Senthil my %hash1 = ( ... ); my %hash2 = ( ... ); my @arr = ({\%hash1 => \%hash2})。 Perl 会在不警告你的情况下运行它,但是,正如 Chas 所说,你不能从 @arr 访问 %hash1 的元素。
【解决方案2】:

你需要使用哈希references

my @array;    
push @array, { k1=>"v1", k2=>"v2" }, { k1=>"v1", k2=>"v2" };

然后,像这样访问哈希:

my $val = $array[0]{k1};

【讨论】:

  • 有趣:Perl DWIM 既是你的不带箭头的表示法,也是我的带箭头的表示法(至少,我使用的 Perl 5.13.4 是这样)。
  • @Jonathan Leffler:那只是因为当您已经索引到数组或哈希(或数组/哈希引用)时,Perl 知道您尝试索引的运算符必须是标量,因此是一个引用,因为只有标量可以插入到数组或散列中。所以不会有直接列表索引或哈希查找之类的东西——它必须是一个参考。但是,如果在上面的示例中您有一个 $array_ref 而不是 @array,那么要访问它,您需要第一个箭头,而不是第二个:my $val = $array_ref->[0]{k1};
  • @Jonathan:是的,正如 perldoc 所述:“箭头是可选的括号下标之间。”
  • eugene y ...谢谢你的回答这个答案符合我的要求
  • 如果一个键包含另一个哈希(键和值),那么上面的代码 sn-p 会是什么样子???
【解决方案3】:

类似:

%h1 = ('a'=>'abc','b'=>'bcd'); # hash 1
%h2 = ('A'=>'Abc','B'=>'Bcd'); # hash 2
@arr = (\%h1,\%h2); # array of hash references.
foreach $hash_ref (@arr) { # iterate through the array.
        foreach $key(keys %$hash_ref) { # iterate through the hash.
                print $key.' '.$$hash_ref{$key}."\n"; #print key => value
        }   
}

【讨论】:

    【解决方案4】:

    为了教你钓鱼,这里有一个链接到Perl data structures cookbook (perldsc),关于在 Perl 中构建复杂的数据结构。

    【讨论】:

      【解决方案5】:

      您需要一个哈希引用,如下面的 { } 所标记。

      my @array = ({ k1 => "v1", k2 => 'v2' }, { K1 => 'V1', });
      

      【讨论】:

      • 如果一个键包含另一个哈希(键和值),那么上面的代码 sn-p 会是什么样子???请告诉答案..
      猜你喜欢
      • 1970-01-01
      • 2010-12-31
      • 1970-01-01
      • 2011-02-23
      • 2010-10-29
      • 2016-07-02
      • 2012-08-03
      • 1970-01-01
      相关资源
      最近更新 更多