#!/usr/bin/perl use strict; use warnings; use Data::Dumper; my @nar = ( ['fact 1 - ParamGrp1', 'foo', 'bar'], ['fact 1 - ParamGrp2', 'qux', 'bom'], ['fact 1 - ParamGrp1', 'fuu', 'gong'], ['fact 2 - ParamGrp1', 'fiu', 'ging'], ); my %data; for my $elem ( @nar ) { my ($key, @val) = @$elem; my ($key_1, $key_2) = split " - ", $key; push @{ $data{$key_1}{$key_2} }, [ @val ]; } print Dumper(\%data);