(...) my $chang = &_changes($entry->get_value("changes")); my %changes = %$chang; sub _changes { my $changesSTR = shift; my (%changes, @tmp); $changesSTR =~ s/\n/ /g; foreach my $element(split(/\s-\s/,$changesSTR)){ if ($element =~ m/(replace|add|delete):\s+([^\s]*)\s*\w+\s*:\s*(.*)$/) { my ($var1,$var2,$var3) = ($1, $2 ,$3); push @tmp,$var3 ; $changes{$var1}{$var2} .= "@tmp" ; @tmp=undef; } elsif ($element =~ m/(replace|add|delete):\s+([^\s]*)$/){ $changes{$1}{$2} .= "undef" ; } } return \%changes; }