in reply to generating hash from array

Change your data structure a little bit (a better one, so that all levels are consistant), you can use some more generic code:

use warnings; use strict; use Data::Dumper; my @array = qw/ comp1-cmd1-test1 comp1-cmd1-test2 comp1-cmd2-test1 comp2-cmd1-test1 comp2-cmd1-test2 comp3-cmd1-test1/; my $hash = {}; for my $element (@array) { my @stuffs = split /-/, $element; insert($hash, \@stuffs); } print Dumper($hash); sub insert { my ($hash, $stuffs) = @_; my $first_element = shift @$stuffs; $hash->{$first_element} = {} if (!defined($hash->{$first_element}) +); insert($hash->{$first_element}, $stuffs) if (@$stuffs); }

This gives:

$VAR1 = { 'comp2' => { 'cmd1' => { 'test1' => {}, 'test2' => {} } }, 'comp3' => { 'cmd1' => { 'test1' => {} } }, 'comp1' => { 'cmd2' => { 'test1' => {} }, 'cmd1' => { 'test1' => {}, 'test2' => {} } } };