use strict; use Data::Dumper; use Carp; my @nar = ( ['fact 1 - ParamGrp1', 'foo', 'bar'], ['fact 1 - ParamGrp2', 'qux', 'bom'], ['fact 1 - ParamGrp1', 'fuu', 'gong'], ['fact 2 - ParamGrp1', 'fiu', 'ging'], ); my %hash; my %param_hash; foreach my $nar (@nar) { my ( $cwd, $prm ) = split( " - ", $nar->[0] ); my @rest = @{$nar}[ 1 .. @{$nar} - 1 ]; push @{ $param_hash{$prm} }, [@rest]; $hash{$cwd} = {%param_hash}; } print Dumper \%hash ;