my $aref = &fieldParse($fullString, '!!', ';', ','); sub fieldParse { my $source = shift; my $ret = []; my $delim = shift; defined($delim) or return $source; for (split $delim, $source) { push @$ret, &fieldParse($_, @_); } return $ret; } #### $VAR1 = [ [ [ 'abcd-efgh-ijkl-mnop' ], [ 'key1=data1', 'key2=data2' ], [ 'key1=data +3', 'key2=data4' ] ], [ [ 'qwer-asdf-zxcv-tyui' ], [ 'key1=data3' ], [ 'key3=data6' ] ], [ [ 'trew-hgfd-yt +re-bvcx' ], [ 'key1=data7', 'key2=data8' ], [ 'key1=data9', 'key2=data10' ] ], [ [ 'erty-dfgh-cvbn- +hjkl' ], [ 'key2=data5' ], [ 'key3=data6' ] ] ];