#!/usr/bin/perl -lw use strict; use Data::Dumper; my $h = { info => { a => 1, b => 2, }, q{info (1)} => { a => 3, c => 4, d => 5, }, q{test (1)} => { e => 5, f => { g => 6, h => 7, }, }, }; test($h); print Data::Dumper->Dump([\$h], [qw(*h)]); sub test { my $self = $_[0]; my @k = grep { /\s+\(1\)$/; } keys %{$self}; foreach my $t (@k) { my $s = $t; $s =~ s/\s+\(1\)$//; if (exists $self->{$s}) { foreach my $i ( keys %{$self->{$t}} ) { if (exists($self->{$s}->{$i})) { if (ref($self->{$s}->{$i}) ne q{ARRAY}) { my $tmp = $self->{$s}->{$i}; delete $self->{$s}->{$i}; push @{$self->{$s}->{$i}, $tmp; } push @{$self->{$s}->{$i}}, $self->{$t}->{$i}; } else { $self->{$s}->{$i} = $self->{$t}->{$i}; } } } else { $self->{$s} = $self->{$t}; } delete $self->{$t}; } }