#!/usr/bin/perl use strict; use warnings; use Data::Dumper; my %hash=( 'navi_liste[0][children][0][children][0][id]' => 'navi_item_12', 'navi_liste[0][children][0][children][1][id]' => 'navi_item_09', 'navi_liste[0][children][0][children][2][id]' => 'navi_item_08', 'navi_liste[0][children][0][children][3][id]' => 'navi_item_07', 'navi_liste[0][children][1][id]' => 'navi_item_11', 'navi_liste[0][children][2][id]' => 'navi_item_10', 'navi_liste[1][id]' => 'navi_item_13', 'navi_liste[2][id]' => 'navi_item_14', ); my %final=reformat_tree(%hash); print Dumper(\%final); sub reformat_tree { my %hash=@_; my %return; while(my ($key,$value)=each(%hash)) { my @names=('unknown'); @names=($1) if($key=~s/^(.+?)\[//s); $key=~s/\]$//s; push(@names, split(/\]\[/,$key)); my $ref=\\%return; for(@names) { if(/^\d+$/) { $ref=\$$ref->[$_]; } else { $ref=\$$ref->{$_}; } } $$$ref=$value; } return %return; }