my $str = join '', map{s/\s+//g;$_}; while($str =~ /@(\w+){([^}]*)}/g){ my ($int, $imp) = ($1,$2); print "<$int>\n"; printf qq{\t<%s name="%s" width="%s"/>\n}, $2,$1,$3 while $imp=~/([^:]+):([^(]+)\((\d+)\);/g; print "\n"; } __DATA__ @interface { i : in(1); o : out(1); } @interface2 { b : out(1); a : in(1); } @interface3 { x : in(1); y : in(1); } @interface4 { f : out(1); b : out(1); } OUTPUT: