#!/usr/bin/perl use strict; use warnings; use Data::Dumper; my %HoH = ( student1 => { quiz => "result", exam => "result", final => "result", }, student2 => { quiz => "result", exam => "result", final => "result", }, student3 => { quiz => "result", exam => "result", final => "result", }, ); print Dumper \%HoH; __END__ $ perl test.pl $VAR1 = { 'student3' => { 'quiz' => 'result', 'final' => 'result', 'exam' => 'result' }, 'student1' => { 'final' => 'result', 'quiz' => 'result', 'exam' => 'result' }, 'student2' => { 'exam' => 'result', 'quiz' => 'result', 'final' => 'result' } }; #### #!/usr/bin/perl use strict; use warnings; use Data::Dumper; use List::Util qw(sum); sub quizSub { return (sum(@_) / 300) * .10; } sub examSub { return (sum(@_) / 200) * .20; } sub finalSub { return (sum(@_) / 100) * .30; } my %HoA; while (<>) { chomp; my @data = split(/,/, ); my $name = shift @data; $HoA{$name} = [ @data ]; } continue { close ARGV if eof; } # print Dumper \%HoA; my %HoH; # print the whole thing sorted by number of members and name foreach my $key ( sort { @{$HoA{$b}} <=> @{$HoA{$a}} || $a cmp $b } keys %HoA ) { # print "$key: ", join(", ", sort @{ $HoA{$key} }), "\n"; my $quiz1 = shift @{ $HoA{$key} }; my $quiz2 = shift @{ $HoA{$key} }; my $quiz = quizSub($quiz1, $quiz2); $HoH{$key}{'quiz'} = $quiz; my $exam1 = shift @{ $HoA{$key} }; my $exam2 = shift @{ $HoA{$key} }; my $exam = examSub($exam1, $exam2); $HoH{$key}{'exam'} = $exam; my $final1 = shift @{ $HoA{$key} }; my $final2 = shift @{ $HoA{$key} }; my $final = finalSub($final1, $final2); $HoH{$key}{'final'} = $final; } print Dumper \%HoH; __END__ $ perl test.pl in.txt $VAR1 = { 'Student2' => { 'quiz' => '0.001', 'final' => '0.033', 'exam' => '0.007' }, 'Student3' => { 'final' => '0.033', 'exam' => '0.007', 'quiz' => '0.001' }, 'Student1' => { 'final' => '0.033', 'exam' => '0.007', 'quiz' => '0.001' } }; #### $ cat in.txt Student1,1,2,3,4,5,6 Student2,1,2,3,4,5,6 Student3,1,2,3,4,5,6