Перебор структуры данных - PullRequest
1 голос
/ 29 августа 2011

Я пытаюсь перебрать эту структуру данных:

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

, где fact[0] увеличивается.Это несколько файлов, которые я обрабатываю, поэтому число {facts}[x] варьируется.

Я думал, что это может сработать, но похоже, что оно не увеличивает $iter var:

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

Я полностью копаю структуры данных, но этот вводит меня в заблуждение.Любой совет, что здесь может быть не так?

Ответы [ 5 ]

4 голосов
/ 29 августа 2011

$ 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";
}
3 голосов
/ 29 августа 2011

Ваш $ iter содержит структуру данных. Что вы в основном хотите, это:

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";
}
3 голосов
/ 29 августа 2011

$iter не будет индексом, с которым вы можете индексировать массив, скорее это текущий элемент массива.Поэтому я думаю, что вы должны быть в порядке:

$iter->{code}
2 голосов
/ 29 августа 2011

Поскольку вы перебираете массив, ваше ошибочное имя $iter - это значение, которое вы ищете, а не индекс. Если вы хотите вместо этого перебрать индексы, выполните:

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

Также обратите внимание, что вы можете сбросить -> между двумя [] или {}:

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

Я рекомендую прочитать http://perlmonks.org/?node=References+quick+reference.

0 голосов
/ 18 сентября 2011

Если у вас есть такие уродливые структуры данных, создайте для них интерфейс, чтобы ваша жизнь была проще:

 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, проблема выглядит не так сложно.

...