2011-08-29 4 views
1

반복 :나는이 데이터 구조를 반복하는 것을 시도하고 데이터 구조

$deconstructed->{data}->{workspaces}[0]->{workspace}->{facts}[0]->{code} 

fact[0]가 증가하고있다. 그것은 내가 처리하고있는 여러 파일들이므로 {facts}[x]의 숫자가 다양합니다.

foreach $iter(@{$deconstructed->{data}->{workspaces}[0]->{workspace}->{facts}}){ 
    print $deconstructed->{data}->{workspaces}[0]->{workspace}->{facts}[$iter]->{code}."\n"; 
} 

을 나는 완전히 데이터 구조를 파고 있어요 그러나 이것은 나에게 유세되어

나는이 작동 할 수 있지만,이 $iter VAR을 강화 될 것 같지 않습니다 생각했다. 어떤 조언이 여기에 잘못되었을 수 있습니까?

+1

'$ iter'은 이미 * 당신이 얻으려고하는 것입니다. 그냥'print $ iter '를해라. "\ n". –

답변

4

$ iter는 배열 이 아닌 색인의 각 항목의 콘텐츠로 설정됩니다. 예 :

my $a = [ 'a', 'b', 'c' ]; 
for my $i (@$a) { 
    print "$i\n"; 
} 

... 인쇄 :

a 
b 
c 

시도 :

foreach $iter (@{$deconstructed->{data}->{workspaces}[0]->{workspace}->{facts}}){ 
    print $iter->{code}."\n"; 
} 
+0

Unk, 당신이 처음이기 때문에 당신은 업보를 얻습니다. 이 모든 답변은 훌륭했습니다!Janie –

+1

당신은 당신이 좋아하는 모든 대답에 대해 upvotes를 줄 수 있으며 문제를 가장 먼저 해결 한 답을 가장 정확한 것으로 확인할 수 있습니다. –

+0

당신을 너무 Upvoting Mugen! 감사! –

3

$iter 그것이 현재 요소 오히려, 당신이 가진 배열을 첨자 할 수있는 인덱스 될 수 없습니다 배열의. 그래서 당신은 다음과 같이 잘해야한다고 생각합니다 :

$iter->{code} 
3

$ iter에 데이터 sctructure가 포함되어 있습니다. 당신이 basiclly 원하는 것은 :

foreach my $elem (@{$deconstructed->{data}->{workspaces}[0]->{workspace}->{facts}}){ 
    print $elem->{code}; 
} 

나 :

foreach my $iter (0 .. scalar @{$deconstructed->{data}->{workspaces}[0]->{workspace}->{facts}}){ 
    print $deconstructed->{data}->{workspaces}[0]->{workspace}->{facts}[$iter]->{code}."\n"; 
} 
2

당신이 배열을 통해 반복되어 있기 때문에, 당신의 이름이 잘못 $iter이 아닌 인덱스 찾고있는 값입니다. 대신 인덱스를 통해 루프를 원하는 경우 는 수행

foreach $iter (0 .. $#{$deconstructed->{data}->{workspaces}[0]->{workspace}->{facts}}) { 
    print "Index $iter: ", 
     $deconstructed->{data}->{workspaces}[0]->{workspace}->{facts}[$iter]->{code}."\n"; 
} 

은 또한 당신이 -> [] 둘 사이 또는 {}을 삭제할 수 있습니다 : 나는 http://perlmonks.org/?node=References+quick+reference을 읽어 보시기 바랍니다

$deconstructed->{data}{workspaces}[0]{workspace}{facts}[$iter]{code} 

. 이 같은 추한 데이터 구조가있는 경우

0

, 그것은 그래서 당신의 삶이위한 인터페이스를 만들 쉽게 :

은 그것도없이
foreach my $fact ($data_obj->facts) { # make some lightweight class for this 
    ....; 
    } 

, 데이터 구조의 단지 부분에 대한 참조를 사용하는 것이 그렇게 필요 당신은 나머지에 대해 생각하지 않습니다 :

my $facts = $deconstructed->{data}{workspaces}[0]{workspace}{facts}; 
foreach my $fact (@$facts) { 
    print "Thing is $fact->{code}\n"; 
    } 

이것은 단지 참조 용이므로 아무 것도 재현하지 않아도됩니다. facts 키를 넘는 부분에 대해서만 생각하면되므로 문제가별로 보이지 않습니다.