2013-07-06 7 views
1

이전에 정의 된 해시에 요소 (값이있는 키)를 추가하는 서브 루틴을 만들려고합니다. 이 서브 루틴은 루프에서 호출되므로 해시가 커집니다. 나는 반환하는 해시가 기존 요소를 덮어 쓰는 것을 원하지 않는다.배열과 hashref를 어떻게 반환합니까?

결국, 전체 누적 된 해시를 출력하고 싶습니다.

지금은 아무 것도 인쇄하지 않습니다. 최종 해시는 비어 있지만 그렇게해서는 안됩니다. 해시 참조로 시도했지만 실제로 작동하지 않습니다.

sub main{ 
    my %hash; 
    %hash=("hello"=>1); # entry for testing 

    my $counter=0; 
    while($counter>5){ 
    my(@var, $hash)=analyse($one, $two, \%hash); 
    print ref($hash); 

    # try to dereference the returning hash reference, 
    # but the error msg says: its not an reference ... 
    # in my file this is line 82 
    %hash=%{$hash}; 

    $counter++; 
    } 

    # here trying to print the final hash 
    print "hash:", map { "$_ => $hash{$_}\n" } keys %hash; 
} 

sub analyse{ 
    my $one=shift; 
    my $two=shift; 
    my %hash=%{shift @_}; 
    my @array; # gets filled some where here and will be returned later 

    # adding elements to %hash here as in 
    $hash{"j"} = 2; #used for testing if it works 

    # test here whether the key already exists or 
    # otherwise add it to the hash 

    return (@array, \%hash); 
} 

을하지만 전혀 작동하지 않습니다 : 서브 루틴 analyse 해시를 수신하지만 반환 해시 참조가 비어 있거나 나도 몰라 짧은 형태로 다음과 같이 내 코드 보인다. 결국 아무 것도 인쇄되지 않습니다.

Can't use an undefined value as a HASH reference 
    at C:/Users/workspace/Perl_projekt/Extractor.pm line 82.

내 실수 어디 :

우선 지금은 말한다, 그것은 참조 아니다 말했다?

모든 조언에 감사드립니다.

답변

5

배열은 perl에서 평탄 해 지므로 hashref가 @var으로 빗나가게됩니다. 이 같은

시도 뭔가 : (당신이하고있는 것처럼) 참조로 해시를 전달하는 경우

my ($array_ref, $hash_ref) = analyze(...) 

sub analyze { 
    ... 
    return (\@array, \@hash); 
} 
+0

:-) 별도의 질문을해야합니다 서브 루틴 내부의 @array의 사용은 와우 덕분이 잘 :)를 작동 –

0

, 당신은 서브 루틴의 반환 값으로 반환 할 필요가 없습니다. 서브 루틴에서 해시를 조작하면됩니다.

my %h = (test0 => 0); 

foreach my $i (1..5) { 
    do_something($i, \%h); 
} 

print "$k = $v\n" while (my ($k,$v) = each %h); 


sub do_something { 
    my $num = shift; 
    my $hash = shift; 

    $hash->{"test${num}"} = $num; # note the use of the -> deference operator 
}