2013-02-20 2 views
1

질문이 있습니다. 해시 및 참조 자료에 익숙하지 않아서 도움이 되었으면합니다. 해시/해시 참조 데이터 구조의 요소에 액세스하는 Perl

나는 다음과 같은 데이터 구조를 가지고 :

$VAR1 = { 
    'http://www.superuser.com/' => { 
     'difference' => { 
      'http://www.superuser.com/questions' => '10735', 
      'http://www.superuser.com/faq' => '13095' 
     }, 
     'equal' => { 
      'http://www.superuser.com/ ' => '20892' 
     } 
    }, 
    'http://www.stackoverflow.com/' => { 
     'difference' => { 
      'http://www.stackoverflow.com/faq' => '13015', 
      'http://www.stackoverflow.com/questions' => '10506' 
     }, 
     'equal' => { 
      'http://www.stackoverflow.com/ ' => '33362' 
     } 
    } 

나는 그래서 나는 다음의 URL에서 다른 작업을 수행 할 수 있습니다 키 'difference'에 모든 URL에 액세스하려면, 올바른 또는 선호하는 방법은 무엇입니까 그 요소에 접근하고 있습니까?

http://www.superuser.com/questions 
http://www.superuser.com/faq 
http://www.stackoverflow.com/faq 
http://www.stackoverflow.com/questions 

------ 수정 ------

:

예를 들어, 나는 다음과 함께 foreach 루프에 물건을 할 수있는 다음과 같은 URL을 사용하여 종료됩니다 위에 표시된 데이터 구조 아래의 요소에 액세스하는 코드 :

my @urls; 
foreach my $key1 (keys(%{$VAR1})) { 
    print("$key1\n"); 
    foreach my $key2 (keys(%{$VAR1->{$key1}})) { 
     print("\t$key2\n"); 
    foreach my $key3 (keys(%{$VAR1->{$key1}{$key2}})) { 
     print("\t\t$key3\n"); 
    push @urls, keys %{$VAR1->{$key1}{$key2}{$key3}}; 
    } 
    } 
} 
print "@urls\n"; 

위의 코드를 사용하면 왜 다음과 같은 오류가 발생합니까?

Can't use string ("13238") as a HASH ref while "strict refs" in use at ....

답변

7

그것은 어려운 일이 아니다, 방금 키 변수의 모든 키의 두 번째 수준 취 :

my @urls; 
for my $key (keys %$VAR1) { 
    push @urls, keys %{$VAR1->{$key}{'difference'}}; 
} 

당신이 역 참조로 어려움을 겪고있는 경우, 다만 명심를 모든 값 해시 또는 배열에서 스칼라 값일 수 있습니다. 멀티 레벨 해시 또는 배열에서 레벨은 하나의 해시/배열이 서로 위에 쌓이는 것입니다.

예를 들어, 당신은 할 수 :

for my $value (values %$VAR1) { 
    push @urls, keys %{$value->{'difference'}}; 
} 

또는

for my $name (keys %$VAR1) { 
    my $site = $VAR1->{$name}; 
    push @urls, keys %{$site->{'difference'}}; 
} 

직접 값 (해시에 대한 참조)를 통해 또는 임시 변수를 통해 경로 중 하나를 ..taking 대표 키를 통한 값 perldoc perldata에서 더 읽을 것이 있습니다.

+0

내가 찾던 것을 정확히 감사합니다. '13015','10506' 및'33362'과 같은 모든 stackoverflow url의 끝에있는 숫자에만 액세스하려는 경우 코드는 어떻게 생겼을까요? 귀하의 도움을 받아 데이터 구조의 다른 부분에 액세스하는 방법을 배워야합니다. –

+0

모든 스택 오버 플로우 URL의 끝에있는 숫자 (예 : 13015, 10506 및 33362)에만 액세스하려는 경우 코드가 표시되는 것을 보여 주시겠습니까 –

+1

@ perl-user 간단합니다. 키 "http : // www.stackoverflow.com /"의 값은 해시 참조입니다. 해당 해시 참조의 키는''difference '' 및''equal''이며 그 값은 해시 참조입니다. 이러한 해시 참조의 값은 사용자가 수행 한 값입니다. 그냥'for' 루프를 쌓아두면 괜찮을거야. 무슨 일이 일어나고 있는지 확실하지 않으면'Data :: Dumper'로 결과를 확인하십시오. – TLP

관련 문제