如何在不重复二级密钥的情况下打印出复杂的哈希值?

use*_*579 2 perl hash perl-data-structures

嗨,我有一个哈希哈希,包含班级名称,注册学生人数和学生姓名.
如何打印此哈希而不重复第二级键.
示例:我填写的哈希数据是Science Class,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";

   }  
}
Run Code Online (Sandbox Code Playgroud)

我得到的结果如下:

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

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

Cha*_*ens 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";
}
Run Code Online (Sandbox Code Playgroud)

但是,考虑到数据的结构,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";
}
Run Code Online (Sandbox Code Playgroud)

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