2013-04-19 2 views
-1

좋아, 내가 같이하는 인쇄물을 폐기장 해시 트리를 생성하는 기능이 있습니다펄 해시 - 해시 심판으로 ("") 문자열을 사용 할 수 없음을

$VAR1 = { 
    'shaders' => { 
    'stock_gui.vert' => '', 
    'stock_font.vert' => '', 
    'stock_gui.frag' => '', 
    'stock_font.frag' => '' 
    }, 
    'textures' => {}, 
    'fonts' => { 
    'DroidSansMono.ttf' => '', 
    'small' => { 
     'DroidSansMono.ttf' => '' 
    } 
    } 
}; 

my $tmpHash = pop(@stack); 

그런 다음 댐퍼 : 루프에서 다음

push (@stack, \%{$myHash->{'fonts'}}); 

:

는 지금은 글꼴 예를 들어 서브 트리를 반복 DFS에 노력하고 있습니다 $ tmpHash가 쇼 :

$VAR1 = { 
    'DroidSansMono.ttf' => '', 
    'small' => { 
    'DroidSansMono.ttf' => '' 
    } 
}; 

문제는 액세스 해시 참조의 아이를 시도하고있다. 나는 열쇠를 세고 아이들을 볼 수있다. 덤퍼 출력은 괜찮아 보입니다. 그러나 같은 일을하려고 :

foreach my $childKey (keys $tmpHash){ 
    my $subChildrenCount = scalar keys(%{$tmpHash->{$childKey}}); 
} 

하면 오류를 얻을 :

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

나는 $ tmpHash 해시 참조이기 때문이라고 생각합니다. 아마 어딘가에 그것을 역 참조 할 필요가있을뿐입니다. 나는 많은 것을 시도했고 모두 더 이상의 이슈를 내 놓는다. 어떤 도움을 주셔서 감사합니다.

내가하려고하면 :

%{$tmpHash->{'small'}} 

그런 다음 잘 작동

.

UPDATE : '.'문자열이 포함되어

  • 경우 이 오류가 발생합니다. 하드 코딩 '작은'작품. 하드 코딩 'stock_gui.vert'는 내가 '.'을 벗어나지 않으면 실패합니다. 나는 점을 벗어날 경우 스스로를 실행하여 볼 수 있듯이 그러나 키

    use strict; 
    use warnings; 
    
    my $tmpHash = { 
        'DroidSansMono.ttf' => '', 
        'small' => { 
        'DroidSansMono.ttf' => '' 
        } 
    }; 
    
    my $subChildrenCount = scalar keys(%{$tmpHash->{'small'}}); 
    

    당신이 말하는 코드는 실제로 오류를 제공하지 않는 오류를 제공, ...

+0

[perlref] (http://perldoc.perl.org/perlref.html)를 살펴보십시오. '\\'와'$ hash_ref'에 대해 혼란스러워하는 것 같습니다. – chrsblck

+0

그런데'\ % {pop (@stack)}'은'pop (@stack)'을하는 이상한 방법입니다. – ikegami

+0

내 perl은 녹슬었고, 나는 그곳에서 논쟁하지 않을 것이다. 그것에 대해 읽어보십시오. 팝은 이상했다 ... pop (@stack) 그 자체만으로도 잘 작동한다. – Halsafar

답변

1

일치하지 않습니다. 나는 당신이 실제로하고있는 것으로 의심한다.

my $subChildrenCount = scalar keys(%{$tmpHash->{'DroidSansMono.ttf'}}); 

당신의 해쉬 포맷은별로 의미가 없다. 필드 이름과 실제 데이터를 키로 섞습니다.

+0

기존 코드를 사용하지만 키를 하드 코드하면 작동합니다. foreach 키 루프를 수행하고 키를 var로 참조하려고하면 오류가 발생합니다. 네, 이상한 해쉬 포맷입니다. 자식이있는 해시는 디렉토리이고, 자식이없는 해시는 파일입니다. 더 이상 정보가 필요하지 않습니다. – Halsafar

+0

업데이트를 참조하십시오. 그것은 '에 관한 모든 것 같다.' 키 문자열에. 불행히도 내가 도망 치면.'일부 정규식으로 오류가 사라지고'Foo \ .ext '가'Foo.ext '키와 일치하지 않으면 모든 것이 반복됩니다. – Halsafar

+0

아니요, 마침표가있는 키에는 문제가 없습니다. 코드의 버그를 Perl에게 비난하지 마세요. – ikegami