use strict; use warnings; $_ = '[1, [2, 3, 4, [5, 6]]]'; my @a; sub e{my($r)=@_;{s/^\]//&&last;s/^\[//&&e($r->[@$r]=[])||s/^, //||s/^(\d+)//&&push@$r,$1and redo}}e\@a; use Data::Dumper; print (Dumper(\@a));