use Parse::RecDescent; my $teststr="a,b,op2(c,d),op3(e,op4(f,g))"; my $grammar = q { startrule: list list: item: word '(' list ')' { "$item[1](".join(",",@{$item[3]}).")" } | word word: /\w+/ }; my $parser = new Parse::RecDescent ($grammar) or die "Bad grammar!\n"; defined (my $result = $parser->startrule($teststr)) or print "Bad text!\n"; print map "<<< $_ >>>\n", @$result;