my @records = ( { employee => 10001, form => 10, date => 20090101, }, { employee => 10002, form => 10, date => 20080515, }, { employee => 10003, form => 10, date => 20080323, }, ); #### sub summarize_by { my $field_name = shift @_; my %out; for my $r ( @records ) { push @{ $out{$r->{$field_name}} }, $r; } return \%out; }