#!/usr/bin/perl use strict; use warnings; use Data::Dumper; my $data='{key1={key11=value11} | key2 = value2 | key3 = {key31=value31 | key32 = value32 | key33 = {key331=value331}}}'; sub parse($) { my $data=shift(@_); my $rcu; $rcu=sub { my $ref; if($data=~s/^\s*\{//s) { $ref={}; while(index($data,'}')!=0) { $data=~s/^[\|\s]*(.+?)\s*=//s; my $n=$1; $ref->{$n}=$rcu->(); } $data=~s/^}//; } else { $data=~s/^\s*(.+?)\s*(\||\})/$2/s; $ref=$1; } return $ref; }; return $rcu->(); } print Dumper(parse($data))."\n";