嗨我有哈希哈希,其中包含班级名称,注册学生人数和学生姓名 如何在不重复第二级键的情况下打印此哈希值 示例:我填写的哈希数据是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";
}
}
我得到的结果如下:
Science_class:2 = Lisa
1 =乔治
3 =的Mathias
Math_class:2 = Anna
1 =马丁
3 =彼得
4 =乔治
但我希望我的结果为:
Science_class:3 - >丽莎,乔治,马蒂亚斯 Math_class:4 - >安娜,马丁,彼得,乔治
如何更正我的脚本?帮助我。
答案 0 :(得分: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中创建和操作数据结构非常有用。
答案 1 :(得分:2)
在标量上下文中,键将返回哈希中的键数。在数组上下文中,它返回这些键的数组。在进入内部循环之前,您希望打印班级名称,然后打印该班级中的学生人数,这样就不会多次打印该编号。
$numkeys = keys $register{$key};
print "$key: $numkeys ->";
后跟该数组中的名称。没有必要使用内部循环来显示名称,只需使用键:
print join(", ", keys $register{$key});
答案 2 :(得分: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";
}