in reply to Style and Coding criticism requested
I'd restructure the loop for reading in the input file a bit:
As you can see, I split the line directly into the needed parts. Furthermore the variable only needed in this loop are declared inside the loop - this locality gives less chances for mistakes.use List::Util qw/sum/; while( <INPUT> ) { next if /^$/; my ($first, $last, @grades) = split; my $name_index = "$last,$first"; my $avg_grade = sum(@grades) / scalar(@grades); $students{$name_index}{grades} = \@grades; $students{$name_index}{avg_grade} = $avg_grade; push @averages, $avg_grade; }
I don't know whether you are allowed to use modules to solve your exercise - but the sum subroutine from List::Util comes in handy here. Otherwise you could just program the sub yourself. I don't see any point in rounding the results you push into @averages. You are only using this internally and why not calculate with the whole precision you have available - thus simplifying the code. You could still do the rounding when you print something out.
A final remark to a differnt part of the code, this: my $i = sprintf("%d", scalar(@averages) / 2 ); could be better written as my $i = int( scalar(@averages)/2 ); Both do rounding towards zero.
-- Hofmator
|
|---|