use Parse::RecDescent; $grammar = << 'STOP'; functiondefine: /function/i name "(" parameter[ $item[2] ](s? /,/) ")" "{" name: /[A-Za-z][a-zA-Z0-9_]*/ parameter: name /as/i variabletype { warn $arg[0] } variabletype: /variant/i | /array/i | /keyarray/i STOP $parser = new Parse::RecDescent($grammar); $text = << 'STOP'; function myfunction(something as variant, somethingelse as array, foo as keyarray) { } STOP $parser->functiondefine($text);