2014-09-22 5 views
1

해시 중 해쉬가 있는데 서브 루틴으로 보내고 해당 키와 해당 값 (키와 값 모두)에 액세스하려고합니다.참조로 "해시 해시"의 내부 값에 액세스

내가 가진 :

sub replace_sub { 
    my ($result_dir, $FilesHash) = @_; 
    foreach my $file (keys %{$FilesHash}) { 
     open(INPUT_FILE, "$result_dir/$file") or die "Can't create output file\n"; 
     my @LINES = <INPUT_FILE>; 
     open(my $output_file, ">", "$result_dir/$file") or die "Can't create output file\n"; 
     foreach my $myline (keys %{ $FilesHash{$file} }) { 
      for (my $i = 0; $i <= $#LINES; $i += 1) { 
       if ($LINES[$i] =~ m/$myline/) { 
        my $line = $LINES[$i]; 
        $LINES[$i] =~ s/\Q$line\E/\/\/ $line $FilesHash{$file}{$myline}\n/g; 
       } 
      } 
     } 
     print $output_file @LINES; 
     close(INPUT_FILE); 
     close($output_file); 
    } 
} 

하지만 내부 해시 값에 액세스하는 방법을 질수 그림, 그렇게하려고 코드 라인은 다음과 같습니다

my $myline (keys %{ $FilesHash{$file} }) 

$LINES[$i] =~ s/\Q$line\E/\/\/ $line $FilesHash{$file}{$myline}\n/g; 

어떻게 액세스 할 수 있습니까? 나는 그런 식으로 subroutin를 호출에 계획입니다

:

replace_sub ($result_dir, \%Hash) 

답변

3

use strict;$FilesHash%FilesHash 같은 것은 없다는 것을 당신에게 말할 것이다 따라서, hashref입니다

$FilesHash{$file} 

교체해야합니다 와 함께

$FilesHash->{$file} 
+0

올바르게 이해하면 예제 $ v2에서 내부 값이 유지됩니까? 예를 들면 :'my % Hash = ("external_key"=> { "inner_key"=> "inner_value",},); '$ v2 = "inner_value"보다? – user3350919

+0

@ user3350919 네, 그리고 당신의 경우에는'$ FilesHash -> {$ file} {$ myline}' –

0

01 해시를 반복 할 때일 때 :

while (($key1, $value1) = each %{$FilesHash}) { 
    while (($key2, $value2) = each %{$value1}) { 
     print "[$key1] $key2 => $value2\n"; 
    } 
} 

N.b. 이게 더 읽기 쉽지만 모든 사람들이이 '좋은'습관을 고려하지는 않을 것입니다 (주석 읽기 @tobyink)

+4

매우 똑똑한 프로그래머들이 많이있다. [각'을 피하] (http : //blogs.perl. org/users/rurban/2014/04/do-not-use-each.html)을 사용하는 것이 좋습니다. 'each '는 빠르지 만'keys'를 반복하면 더 안전해질 수 있습니다. 개인적으로'keys '를 반복하고 벤치마킹 할 때 병목 현상이있는 것으로 입증 된 특정 격리 루프에 대해서만'각 '을 고려해야하며, 안전하다고 입증 될 수있는 경우에만이를 고려하십시오. – tobyink

관련 문제