Perl哈希获取GPA最值及对应学生问题求助
解决你的Perl GPA计算与哈希/数组问题
嘿,刚看完你的代码,发现两个核心问题,咱们一个个来搞定:
问题1:哈希初始化时机错误,且打印逻辑搞反
你现在是先定义了哈希%stud_gpa,再去计算各个GPA变量——这时候$gpa_one到$gpa_ten都是未赋值的状态(值为undef),所以哈希里的所有GPA值都是空的,排序自然输出空内容。另外,你的打印语句把学生姓名和GPA搞反了:$gpavalues[-1]是排序后的学生姓名(因为你sort的是哈希的keys,也就是姓名),对应的GPA是$stud_gpa{$gpavalues[-1]}。
修正方案:
- 先调用计算GPA的子程序,把所有
$gpa_x变量赋值完成 - 再构建哈希
%stud_gpa - 修正打印时的变量对应关系
修正后的代码片段:
# 先执行计算GPA的子程序,确保$gpa_one到$gpa_ten都有值 # (这里假设你有计算每个GPA的子程序,比如&calc_gpa_one之类的,先调用它们) &calc_gpa_one; &calc_gpa_two; # ... 其他GPA计算子程序都要先调用 # 现在再构建哈希 my %stud_gpa = ( $name[0] => $gpa_one, $name[1] => $gpa_two, $name[2] => $gpa_three, $name[3] => $gpa_four, $name[4] => $gpa_five, $name[5] => $gpa_six, $name[6] => $gpa_seven, $name[7] => $gpa_eight, $name[8] => $gpa_nine, $name[9] => $gpa_ten, ); sub gpa_hash{ # 按GPA数值排序姓名(从小到大) my @sorted_names = sort { $stud_gpa{$a} <=> $stud_gpa{$b} } keys %stud_gpa; my $top_student = $sorted_names[-1]; my $bottom_student = $sorted_names[0]; print "the max GPA is $stud_gpa{$top_student} of the student $top_student<br>"; print "the min GPA is $stud_gpa{$bottom_student} of the student $bottom_student<br>"; }
问题2:标量引用的排序与打印未解引用
你把GPA变量的引用存在@tot_gpa里,但排序的时候直接用$a <=> $b比较的是引用的内存地址,不是实际的GPA数值;打印的时候也没解引用,所以输出的是SCALAR地址。
修正方案:
排序和解引用都要用到$$来访问引用指向的实际值:
修正后的代码片段:
my @tot_gpa = ( \$gpa_one, \$gpa_two, \$gpa_three, \$gpa_four, \$gpa_five, \$gpa_six, \$gpa_seven, \$gpa_eight, \$gpa_nine, \$gpa_ten ); sub gpa{ # 排序时解引用,比较实际GPA值 my @sorted_gpas = sort { $$a <=> $$b } @tot_gpa; my $min_ref = $sorted_gpas[0]; my $max_ref = $sorted_gpas[-1]; # 打印时也要解引用 print "this is the smallest GPA: $$min_ref<br>"; print "this is the highest GPA: $$max_ref<br>"; }
额外小建议
其实你不用定义10个单独的$gpa_x变量,可以用数组来存GPA,代码会更简洁。比如:
my @gpas; # 计算每个学生的GPA,存进@gpas数组 @gpas = (&calc_gpa_1, &calc_gpa_2, ..., &calc_gpa_10); # 或者循环计算 # 然后构建哈希可以用哈希切片: my %stud_gpa; @stud_gpa{@name} = @gpas;
这样不管学生数量是多少,代码都更容易维护,不用手动写10个变量~
内容的提问来源于stack exchange,提问作者Mattia
相关产品推荐
相关产品推荐

