use warnings; use strict; use Data::Dumper; my $file = "1.00 InDev 01-Jun-2013 1.00 InTest 15-Jul-2013 1.00 InUAT 31-Jul-2013 1.00 InProd 15-Sep-2013 1.01 InDev 01-Jul-2013 2.00 InDev 01-Aug-2013 3.00 InDev 01-Sep-2013"; my %line; for ( split /\n/, $file ) { my @datas = split; push @{ $line{ $datas[0] }{ $datas[1] } }, $datas[2]; } { $Data::Dumper::Sortkeys = 1; $Data::Dumper::Indent = 3; print Dumper \%line; }