2010-07-20 7 views
5

에 다중 값 해시를 반전 I는 다음과 같습니다 해시를 가지고있다. 어떻게 든 역순 함수를 사용해야합니까?

참고 : 항상 원래 해시를 반복하고 새 해시에 따라 키와 값을 할당 할 수 있습니다. 더 매끄러운 방법이 있는지 알고 싶었습니다.

+0

나는 우리 대답 중 하나를 받아 들여야한다고 생각합니다. Kinopiko의 한 라이너보다 어떻게 더 매끄럽게 할 수 있습니까? – masonk

답변

6

는 매끄러운 방법이 필요하지 마십시오

my %h = (
    bmw  => { id => 1, color => "brown" } , 
    mercedes => { id => 2, color => "black" } 
); 
my %j = map { ($h{$_}{id} => $_) } keys %h; 

for (keys %j) { 
    print "$_ $j{$_}\n"; 
} 

출력 : 당신이 게시 한 무엇

 
$ ./silly.pl 
1 bmw 
2 mercedes 
+0

안녕하세요. 솔루션을 계속 사용할 필요가 없습니다. 당신의 방법은 내게 꽤 매끄럽게 보입니다. :). – masonk

+0

이것은 일반적인 방법입니다. –

+0

"매끄러운"다른 정의가 있음을 알았습니다. – masonk

2

이 유효 펄 아니지만, 내가 당신의 뜻을 생각합니다. 이를 수행하는 한 가지 방법은 hash slice과지도를 사용하는 것입니다.

my %hash = (
    bmw  => { id => 1, color => 'brown' }, 
    mercedes => { id => 2, color => 'black' }, 
); 
my %new_hash; 
@new_hash{ map { $_->{id} } values %hash } = keys %hash; 
+0

new_hash 이전의 마지막 줄에 별칭 (@) 기호가 사용 된 이유는 무엇입니까? – syker

+0

@syker : "hash slice"에 대해 제공된 masonk 링크를 참조하십시오. –

+0

위의 링크 된 해시 슬라이스의 특수 구문입니다. 왼쪽에있는 키 목록과 오른쪽에있는 값 목록을 제공합니다. Perl은 값 % hash가 반환되는 순서가 키 % hash가 반환되는 순서와 같음을 보장하므로이 방법이 유용합니다. – masonk