use warnings; use strict; use Data::Dumper; $Data::Dumper::Sortkeys = 1; my %courses; while () { chomp; my ($id, $desc, $sit, $date) = split /,/; $courses{$id}{desc} = $desc; $courses{$id}{sittings}{$sit} = $date; } print Dumper(\%courses); __DATA__ 10,Programming 101,1,01-SEP-2011 20,Databases 101,1,03-SEP-2011 10,Programming 101,2,20-SEP-2011 20,Databases 101,2,27-SEP-2011