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 ; #### $VAR1 = { 'fact 1' => { 'ParamGrp2' => [ [ 'qux', 'bom' ] ], 'ParamGrp1' => [ [ 'foo', 'bar' ], [ 'fuu', 'gong' ] ] }, 'fact 2' => { 'ParamGrp1' => [ [ 'fiu', 'ging' ] ] } };