По поводу сложных хэшей в perl - PullRequest
0 голосов
/ 06 июля 2011

У меня есть хэш хэша, где мой первый ключ - это имя, а второй - некоторые классы, такие как level A, level B, level C, а значения - это общее количество студентов.

%hash{name}->{class}->number

Таким образом, я заполняю свой хэш, и все готово, но теперь, когда я печатаю, я получаю число, но если предположить, что имя студента находится на уровне A и уровне C, а не на уровне B, оно должно показать

Name:level A = 1
     level B = 0
     level C = 1

Как я могу получить свой результат, как это?Пожалуйста, помогите мне ..

Ответы [ 2 ]

3 голосов
/ 06 июля 2011
use strict;
use warnings;

my %scores = (
    homer => { levA => 1, levC => 2 },
    bart =>  { levA => 3, levB => 4 },
);

my %all_levels = map { map {$_ => 1} keys %$_  } values %scores;

for my $h (values %scores){
    for my $lev (keys %all_levels){
        $h->{$lev} = 0 unless exists $h->{$lev};
    }
}
0 голосов
/ 06 июля 2011

Это немного натянуто, но я думаю , что вам нужно, это присвоить нулевое значение всем парам (имя, класс), для которых $hash{name}->{class} не определено. Итак, учитывая, что ...

my @classes; #First, we grab all of the possible classes.

foreach my $name (sort keys %hash)
{
    foreach my $class (sort keys %{$hash->{$name}})
    {
        push @classes, $class unless $class~~@classes;
    }
}

@classes=sort @classes #or sort{$a<=>$b}@classes, depending on the datatype...

foreach my $name(sort keys %hash)
{
    foreach my $class(@classes)
    {
        $hash->{$name}->{$class}=0 unless defined $hash->{$name}->{$class};
    }
}
...