Perl에서 해시를 결합하려면 어떻게해야합니까?


95

두 해시를 % hash1에 결합하는 가장 좋은 방법은 무엇입니까? 저는 항상 % hash2와 % hash1에 고유 한 키가 있다는 것을 알고 있습니다. 가능하면 한 줄의 코드를 선호합니다.

$hash1{'1'} = 'red';
$hash1{'2'} = 'blue';
$hash2{'3'} = 'green';
$hash2{'4'} = 'yellow';

답변:


168

빠른 답변 (TL; DR)

    % hash1 = (% hash1, % hash2)

    ## 아니면 ...

    @ hash1 {keys % hash2} = 값 % hash2;

    ## 또는 참조 포함 ...

    $ hash_ref1 = {% $ hash_ref1, % $ hash_ref2};

개요

  • 컨텍스트 : Perl 5.x
  • 문제 : 사용자가 두 개의 해시 1 을 단일 변수로 병합하려고 합니다.

해결책

  • 간단한 변수에 위의 구문을 사용하십시오.
  • 복잡한 중첩 변수에 Hash :: Merge 사용

함정

또한보십시오


각주

1 * (일명 연관 배열 , 일명 사전 )


2
예, 키 충돌이 없으면 @ hash1 {keys % hash2} = 값 % hash2; 가장 빠르고 짧은 방법 인 AFAIK입니다.
kixx

46
왜 당신은 할 수 없다%hash1 = (%hash1, %hash2)
user102008

1
참조에서도 작동하는 것 같습니다. $ hash_ref1 = ($ hash_ref1, $ hash_ref2);
레페

2
병합하지 않음으로 설정 $hash_ref1됩니다 $hash_ref2. 당신은 원한다 $hash_ref1 = { %$hash_ref1, %$hash_ref2 };, 내가 대답을 편집 할 것이다.
M Somerville

38

perlfaq4 확인 : 두 개의 해시를 병합하는 방법 . Perl 문서에는 이미 많은 좋은 정보가 있으며 다른 사람이 대답하기를 기다리지 않고 바로 얻을 수 있습니다. :)


두 해시를 병합하기로 결정하기 전에 두 해시에 동일한 키가 포함되어 있고 원래 해시를 그대로 유지하려는 경우 수행 할 작업을 결정해야합니다.

원래 해시를 유지하려면 하나의 해시 (% hash1)를 새 해시 (% new_hash)에 복사 한 다음 다른 해시 (% hash2)의 키를 새 해시에 추가합니다. 키가 이미 % new_hash에 있는지 확인합니다. 중복 항목으로 수행 할 작업을 결정할 수있는 기회를 제공합니다.

my %new_hash = %hash1; # make a copy; leave %hash1 alone

foreach my $key2 ( keys %hash2 )
    {
    if( exists $new_hash{$key2} )
        {
        warn "Key [$key2] is in both hashes!";
        # handle the duplicate (perhaps only warning)
        ...
        next;
        }
    else
        {
        $new_hash{$key2} = $hash2{$key2};
        }
    }

새 해시를 만들고 싶지 않은 경우에도이 루핑 기술을 사용할 수 있습니다. % new_hash를 % hash1로 변경하십시오.

foreach my $key2 ( keys %hash2 )
    {
    if( exists $hash1{$key2} )
        {
        warn "Key [$key2] is in both hashes!";
        # handle the duplicate (perhaps only warning)
        ...
        next;
        }
    else
        {
        $hash1{$key2} = $hash2{$key2};
        }
    }

한 해시가 다른 해시의 키와 값을 덮어 쓰는 것에 신경 쓰지 않는다면 해시 슬라이스를 사용하여 한 해시를 다른 해시에 추가 할 수 있습니다. 이 경우, % hash2의 값은 공통 키가있을 때 % hash1의 값을 대체합니다.

@hash1{ keys %hash2 } = values %hash2;

다른 문제 perlfaq 링크에 좋은 및 기타 리소스
크리스

14

이것은 오래된 질문이지만 'perl merge hashes'에 대한 내 Google 검색에서 많이 나왔지만 매우 유용한 CPAN 모듈 Hash :: Merge에 대해서는 언급하지 않았습니다.


이를 포함하도록 최다 투표 답변이 업데이트되었습니다.
dreftymac

6

해시 참조 용. 다음과 같은 중괄호를 사용해야합니다.

$hash_ref1 = {%$hash_ref1, %$hash_ref2};

그리고 하지 괄호를 사용하여 위의 제안 대답 :

$hash_ref1 = ($hash_ref1, $hash_ref2);
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.