use Data::Dumper; $_ = Dumper $data_struct; s/[\s',;]//g; s/.*=//; s/(\w)(?=\w)/$1,/g; print; # convert A[B,C] -> [AB,AC] while(s!(\w+)\[([\w,]+)\]!'['.join(',',map$1.$_, split/,/,$2).']'!e # convert [[[AB,AC]]] -> [AB,AC] || s!\[(\[[\w,]+\])\]!$1! # convert [AB,AC][DE] -> [AB,AC,DE] || s!\[([\w,]+)\]\[([\w,]+)\]![$1,$2]!) { # see what happens after every step print }