2012-08-28 4 views
0

두 해시 배열 : AH1과 AH2가 있습니다.perl 해시가 해시 배열에 있는지 확인하는 방법은 무엇입니까?

$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 
      } 
     ]; 
내가 펄 기능이 존재하여 AH2에 AH1의 해시를 인쇄 할 수있는 방법을

? 또는 배열에서 반복하지 않아도됩니다.

답변

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 개의 키 (headline, started_at, author, name)를 사용해야한다. – mamesaye

+0

키를 만들 수 없다면 (예 :'join (':', @ {$ _} {qw (headline started_at author name)}))'), $ AH1) {for (@ $ AH2) {}}'. – ikegami

관련 문제