2

嗨,我有一个包含班级名称、注册学生人数和学生姓名的哈希哈希。
如何在不重复二级键的情况下打印出此哈希。
示例:我填写哈希的数据是科学课,3 名学生注册了 George,Lisa,Mathias 和 Math Class,4 名学生注册了 Peter,George,Anna,Martin。

my %register=();

$register{$className}->{$count_students}=$student_name; # Fill the hash.

  foreach my $key ( keys %register ){      

   print "$key: ";

   foreach my $class ( keys %{ $register{$key} } ){

       print "$class=$register{$key}->{$class}\n";

   }  
}

我得到如下结果:

Science_class: 2=Lisa
1=George
3=Mathias
Math_class: 2=Anna
1=Martin
3=Peter
4=George

但我希望我的结果为:

Science_class: 3 -> Lisa, George, Mathias
Math_class: 4 -> Anna, Martin, Peter, George

如何更正我的脚本?帮帮我。

4

3 回答 3

5

keys您可以使用标量上下文中的函数获取第二级中的条目数,并且您可以使用该函数仅获取第二级中的values值。

#!/usr/bin/perl

use strict;
use warnings;

my %register = (
    Science_class => {
        1 => "George",
        2 => "Lisa",
        3 => "Mathias",
    },
    Math_class => {
        1 => "Martin",
        2 => "Anna",
        3 => "Peter",
        4 => "George",
    }
);

for my $class (keys %register) {
    print "$class: ", scalar keys %{$register{$class}},
        " ", join(", ", values %{$register{$class}}), "\n";
}

但是,考虑到数据的结构,arrayrefs 的哈希更有意义:

#!/usr/bin/perl

use strict;
use warnings;

my %register = (
    Science_class => [
        "George",
        "Lisa",
        "Mathias",
    ],
    Math_class => [
        "Martin",
        "Anna",
        "Peter",
        "George",
    ]
);

for my $class (keys %register) {
    print "$class: ", scalar @{$register{$class}},
        " ", join(", ", @{$register{$class}}), "\n";
}

您可能会发现阅读perldoc perldsc有助于理解如何在 Perl 5 中创建和操作数据结构。

于 2011-07-12T13:57:45.580 回答
2

在标量上下文中,键将返回散列中键的数量。在数组上下文中,它返回这些键的数组。您想在进入内部循环之前打印班级名称,后跟该班级的学生人数,这样您就不会多次打印该数字。

$numkeys = keys $register{$key};
print "$key: $numkeys ->";

后跟该数组中的名称。不需要有一个内部循环来显示名称,只需使用键:

print join(", ", keys $register{$key});
于 2011-07-12T13:52:05.480 回答
1

无需存储每个班级的学生人数,因为您只需计算结构中的学生人数即可。(因此,当您的结构发生变化时,您的计数不会不同步。)我建议使用数组哈希,如下所示:

use strict;
use warnings;

my %register;

# populate the hash, e.g.:
my $classname = 'science_class';
push @{ $register{$classname} }, 'Lisa';
push @{ $register{$classname} }, 'George';
push @{ $register{$classname} }, 'Mathias';

# print the results:

foreach my $class( sort keys %register ) { 
    print $class, ' : ';
    my @students = @{ $register{$class};
    print scalar( @students ), ' = ';   # number of elements in the array
    print join ', ', @students;
    print "\n";
}
于 2011-07-12T13:59:16.887 回答