#!/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|key332={key3321=value3321|key3322=value3322|key3321=value3322}|key333=value333|key334=value334}}}'; package BNF; sub encode($) { 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->(); } package main; print Dumper(BNF::encode($data))."\n";