2011-11-15 3 views
15

나는 기본적인 것으로 보이는 질문이 있지만 알아낼 수는 없습니다. Perl에서 해시 참조가 있다고 가정 해 보겠습니다. 일련의 키를 통해 값 배열을 가져 오려고합니다. 여기Perl : 해시 참조로 키 배열에 액세스

이 해시 작업을 줄 방법이 아닌 해시 참조 :

my %testHash = ("a" => 1, "b" => 2, "c" => 3); 
my @testKeys = ("a", "b", "c"); 

my @testValues = @testHash{@testKeys}; 

가 지금은 해시 참조가 가정

my $hashRef = {"a" => 1, "b" => 2, "c" => 3}; 

나는 다음과 같은 두 가지 방법을 시도했다 :

my @values = @{$hashRef->{@testKeys}}; 
my @values = $hashRef->{@testKeys}; 

하지만 어느 쪽도 맞지 않습니다. 올바른 방법이 있습니까? 아니면 해시를 참조 할 때마다 참조를 역 참조해야합니까?

답변

21

당신이 가까이있어 :

my @values = @$hashref{@testKeys};  ## (1) 

이상의 예를 들어

my @values = @{$hashref}{@testKeys}; ## (2) 

"Slices" in the perllol documentation를 참조하십시오.

"Using References" in the perlref documentation은 일반적인 규칙을 제공합니다.

1. 변수 또는 서브 루틴 이름의 일부로 식별자 (또는 일련의 식별자)를 넣는 곳에서는 식별자를 올바른 유형의 참조를 포함하는 간단한 스칼라 변수로 바꿀 수 있습니다.

이유는 (1)이 작동하는 이유입니다. testHash 식별자를 간단한 스칼라 $hashRef으로 바꿨습니다.

2. 변수 또는 서브 루틴 이름의 일부로 식별자 (또는 일련의 식별자)를 넣는 곳이면 식별자를 올바른 유형의 참조를 반환하는 BLOCK으로 바꿀 수 있습니다.

위의 Snippet (2)은 거의 동일하지만 조금 더 부피가 큰 구문을 사용합니다. 식별자 testHash 대신에 해시에 대한 참조 인 을 반환하는 블록 (예 :, {$hashRef})을 작성합니다. 당신이 계산하고 참조를 반환 할 수 있도록 여기

중괄호이 경우

push @{ $cond ? \@a1 : \@a2 }, "some value"; 
+2

같이하는 선의의 블록을 둘러싸,'@의 $의 hashref는 {@testKeys은}'도 작동합니다. 나는 {{}'중괄호를 더 명시 적으로 선호 했었지만 지금은 덜 시끄러운 변종을 선호합니다. – ephemient

+0

@ephemient 답변을 제공해 주셔서 감사합니다. –

+0

아, 나는 화살표가 단지 편리한 속기라는 이해가 부족함에 갇혔다 고 생각합니다. –