2012-08-28 82 views
0

我有两个散列数组:AH1和AH2。perl如何使用exists检查散列是否在散列数组中

$AH1 = [ 
      { 
      'id' => 123, 
      'name' => abc 
      }, 
      { 
      'id' => 456, 
      'name' => def 
      }, 
      { 
      'id' => 789, 
      'name' => ghi 
      }, 
      { 
      'id' => 101112, 
      'name' => jkl 
      }, 
      { 
      'id' => 1389, 
      'name' => mno 
      } 
     ]; 

$AH2 = [ 
      { 
      'id' => 123, 
      'name' => abc 
      }, 
      { 
      'id' => 1389, 
      'name' => mno 
      }, 
      { 
      'id' => 779, 
      'name' => ghi 
      } 
     ]; 

如何打印使用Perl 存在功能是AH1的哈希值在AH2?或者不必在数组中迭代。

回答

1

exists按指数定位,它们是0,1,2,而不是123,1389,779。 exists不禁。

此外,除非将其中一个数组切换到哈希值,否则必须对这两个数组(迭代)进行迭代。

$HH2 = { 
    123 => { 
      'id' => 123, 
      'name' => abc 
      }, 
    1389 => { 
      'id' => 1389, 
      'name' => mno 
      }, 
    779 => { 
      'id' => 779, 
      'name' => ghi 
      } 
}; 

实际上,切换是解决这个问题的最简单方法。

my %HH2 = map { $_->{id} => $_ } @$AH2; 
for (@$AH1) { 
    print "$_->{id} in both\n" 
     if $HH2{ $_->{id} }; 
} 

它也很有效率:您只遍历每个数组一次。

+0

添加到我的答案。 – ikegami

+0

哈希值更复杂,仅使用id不足以验证存在。我必须使用哈希的4个键(标题,started_at,作者,名称)。 – mamesaye

+0

如果你不能创建一个键(例如'join(':',@ {$ _} {qw(headline started_at author name)});'),你必须使用一些昂贵的东西,如for(@ $ AH1){for(@ $ AH2){}}'。 – ikegami

相关问题