Как перебрать многоуровневый хеш в perl - PullRequest
2 голосов
/ 23 февраля 2011
my $app = "info";
my %records;
for($i = 0; $i<5; $i++)
{
 push@{$records{$app}{"id"}},$i;
 push@{$records{$app}{"score"}}, $i+4;
}

так что есть 5 идентификаторов [0,1,2,3,4,5] и 5 баллов. Мой вопрос - как перебирать каждый идентификатор и соответствующий счет ... пожалуйста, помогите мне ... в основном яхотите напечатать результат следующим образом

id score
0   4
1   5
2   6
3   7
4   8 
5   9

Ответы [ 2 ]

1 голос
/ 23 февраля 2011

Попробуйте это:

print "id\tscore";
for($i=0; $i<5; $i++) {
    print "\n$records{$app}{id}[$i]\t$records{$app}{score}[$i]";
}
0 голосов
/ 23 февраля 2011
printf "id\tscore\n";
for my $app (keys %records) {
    my $apprecordref = $records{$app};
    my %apprecord = %$apprecordref;

    my $idlen = scalar(@{$apprecord{"id"}});
    for ($i = 0; $i < $idlen; $i++) {
        printf "%d\t%d\n", $apprecord{"id"}[$i], $apprecord{"score"}[$i];
    }
}

id  score
0    4
1    5
2    6
3    7
4    8

Или вот другой способ сделать это, который я думаю, немного проще:

my $app = "info";
my %records;
for (my $i = 0; $i < 5; $i++)
{
    # $records{$app} is a list of hashes, e.g.
    # $records{info}[0]{id}
    push @{$records{$app}}, {id=>$i, score=>$i+4};
}

printf "id\tscore\n";
for my $app (keys %records) {
    my @apprecords = @{$records{$app}};

    for my $apprecordref (@apprecords) {
        my %apprecord = %$apprecordref;
        printf "%d\t%d\n", $apprecord{"id"}, $apprecord{"score"};
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...