#!/usr/bin/perl use strict; use warnings; use Data::Dumper; my @arr = ( 'ng1', ['ng1_1','ng1_2', 'ng1_3', 'ng1_4'], 'ng2', ['ng2_1','ng2_2', 'ng2_3', 'ng2_4'], 'ng3', ['ng3_1','ng3_2', 'ng3_3', 'ng3_4'], 'ng1_1', ['ng1_1_1','ng1_1_2', 'ng1_1_3', 'ng1_1_4'], 'ng1_1_1', ['ng1_1_1_u1', 'ng1_1_1_u2', 'ng1_1_1_u3'], 'ng2_1', ['ng2_1_u1', 'ng2_1_u2', 'ng2_1_u3'] ); my @tree; #print "\nBEFORE CALLING FIRST FOR LOOP\n"; #print Dumper @arr; $tree[0] = $arr[0]; $tree[1] = $arr[1]; for (my $i=2; $i < @arr; $i+=2){ &buildTree(\@tree, $arr[$i], $arr[$i+1]); } #print "\nAFTER CALLING FIRST FOR LOOP\n"; #print Dumper @arr; #$tree[2] = $arr[2]; #$tree[3] = $arr[3]; #for (my $i=4; $i < @arr; $i+=2){ # &buildTree(\@tree, $arr[$i], $arr[$i+1]); #} sub buildTree{ my ($tree, $parNg, $subNg) = @_; for my $treeElement (@{$tree}){ if (ref $treeElement eq "ARRAY"){ &buildTree($treeElement, $parNg, $subNg); } else{ if ($treeElement eq $parNg){ my ($index) = grep { $tree->[$_] eq $treeElement } 0..scalar(@$tree)-1; splice @{$tree}, $index + 1, 0, $subNg; } } } }