2016-07-07 2 views
0

나는 다음과 같은 다차원 해시가 서브 루틴. 내가 hashFunc($hashTable{'2'})로 함수를 호출 할 때 예를 들어 은 패스 중첩 된 해시

hashFunc($hashTable{'2'}); 

sub hashFunc{ 
    my %innerHash = $_[0]; 
} 

그러나, 나는 어떻게 제대로 서브 루틴에 인수로 내부 해시를 제공 할 오류

Reference found where even-sized list expected 

을받을 수?

+0

에 대한 Perl references short introductionPerl data structures intro 살펴 보셔야합니다. 나는이 코드에 어떤 오류도 내지 않았다. – Arseniy

+0

이 오류도 발생하지 않습니다. 환경에 대해 자세히 설명해주십시오. –

+3

perl의 모든 버전에서 오류가 발생합니다. 경고가 보이지 않으면 켜십시오. – mob

답변

3

다차원 데이터 구조는 참조를 통해 어셈블됩니다.

는 해시 값을 나타내는 스칼라 값입니다. 서브 루틴에서 사용하려면

, 당신은 역 참조 할 필요 - 중 전에 는 전송하기 : 당신이 당신이 다음 해시에 할당 할 수있는 값의 목록을 (보내드립니다

hashFunc(%{$hashtable{'2'}}); 

).

또는 해시 :

my %innerHash = %{$_[0]}; 

그러나 보로딘이 지적 하듯 -이 데이터 구조를 복사하게됩니다, 이것은 비효율적이고 거의 필요하다.

my ($innerHash) = @_; 

그리고 당신은 같은 역 참조 연산자를 통해 $innerHash에 액세스 할 수 있습니다 :

그래서 대신 할 수

print $innerHash -> {'A'}; 
foreach my $key (keys %$innerHash) { 
    print $key,"\n"; 
} 

+3

*** 절대적으로 아닙니다! *** 이러한 솔루션 중 하나를 제안하는 것은 오해의 소지가 있습니다. 해시를 Dereferencing하는 것은 거의 필요하지 않으며 결과가 불필요하게 데이터를 복제하는 원본의 1 레벨 복사본이라는 것은 분명하지 않습니다. 참조는 서브 루틴으로 직접 전달되어야합니다 – Borodin

2

내부 해시를 해시로 사용해야하는 경우 내부 참조를 역 참조해야합니다.

당신은

hashFunc(%{ $hashTable{2} }); 
sub hashFunc { 
    my %innerHash = @_; 

, 당신은 일반적으로 해시를 사용할 필요가 없습니다, 당신은 단지 해시 참조를 사용할 수있는 서브 루틴

hashFunc($hashTable{2}); 
sub hashFunc { 
    my %innerHash = %{ $_[0] }; 

또는 호출 코드에 그렇게 할 수 직접.

hashFunc($hashTable{2}); 
sub hashFunc { 
    my $innerHashRef = shift; 
    # Whatever you need to do with the hash: 
    $innerHashRef->{key}{A} = ... 
    for my $key (keys %$innerHashRef) { 
    ... 
+0

두 번째 경우에는'my % innerHash = @_;'를 할 필요가 없습니까? – Dada

+0

@Dada : 사실, 고마워요. – choroba

+0

[Sobrique의 해결책] (http://stackoverflow.com/a/38247206/622310)과 동일한 문제가 있습니다. 전체 해시를 역 참조하는 것은 낭비적이고 거의 불필요합니다. – Borodin

4

펄 해시 값은 스칼라해야하며, 중첩 된 데이터 구조는이

처럼

당신은 당신의 서브 루틴 내에서 스칼라 값을 할당해야하는 각 배열이나 해시 값에 대한 해시 또는 배열에 참조를 사용하여 구축

hashFunc($hashTable{'2'}); 

sub hashFunc{ 
    my ($innerHash) = @_; 
    # same as my $innerHash = $_[0] 
    ... 
} 
당신은 보조 해시하고 싶은 일에 대해 아무 말도하지 않지만, 일반적으로 당신이 $innerHash->{key}를 사용하여 내부 해시의 요소에 액세스 할 수 있습니다, 또는 당신은 keys, values, 또는 each을 사용할 수 있습니다

값을 역 참조 (dereferencing)하여 연산자; 예를 for my $k (keys %$innerHash) { ... }

을 위해 당신은 자세한 내용은 사용합니까 펄의 버전을

관련 문제