2010-07-23 3 views
2

배열이 있고 해시 인스턴스를 만들고 있습니다. 는 예를 들어, 배열이 아닌 경우 :배열에 의해 결정되는 Perl 해시 키

@folders=(temp,usr,bin); 

그때 내가 해시를 입력하려면 :

$the_path{$folders[0]}{$folders[1]}{$folders[2]}="somevalue"; 

을하지만 배열 만있는 경우 :

@folders=(bin); 

는 내가 경로를 원하는 be :

$the_path{$folders[0]}="somevalue"; 

문제는 배열이 얼마나 오래 될지 미리 알지 못하며, 해당 솔루션의 명령문이 심각하게 확장되면 x을 작성하는 것을 피하고 싶습니다.

어떻게하면됩니까?

+1

'엄격한 사용; 당신의 파일의 상단에, 맞죠? 그것은 당신을 위해 많은 실수를 잡을 것입니다. – Ether

답변

5

먼저 Perl에서 배열을 정의하는 방법이 아닙니다.

$VAR1 = { 
      'temp' => { 
         'usr' => { 
           'bin' => {} 
           } 
        } 
     }; 

경우 :

my %the_path; 
my $tmp = \%the_path; 
foreach my $item(@folders) { 
    $tmp->{$item} = { }; 
    $tmp = $tmp->{$item}; 
} 

이것은 다음과 같은 구조가 발생합니다 : 당신은 아마 목록에서 중첩 된 해시 키를 만들기위한 오래된 트릭이있다

my @folders = ('temp', 'usr', 'bin'); 

하고 싶은 말 맨 아래 레벨의 빈 hashref를 문자열로 바꾸려면 루프 내부의 카운트 변수를 추적 할 수 있습니다.

+0

+1 나를 똑같은 해결책으로 때려 눕힌다 :) – Cfreak

+1

언제나 그렇듯이, 우리는 이미 CPAN 모듈을 가지고있다. [Data :: Diver] (http://p3rl.org/Data::Diver)는 제가 가장 좋아하는 게임입니다. – daxim

관련 문제