use strict; use Parse::RecDescent; my $parser = Parse::RecDescent->new(q( start: chunk(s) chunk: tag | raw tag : stag raw etag { print "tag: $item[1] $item[2] $item[3]\n"; #$return = "$item{stag} $item{raw} $item{etag}" $return = "$item[1] $item[2] $item[3]"; } | stag raw tag(s) raw etag { print "tag: $item[1] $item[2] $item[3] $item[4] $item[5]\n"; #$return = "$item{stag} $item{raw} $item{etag}" $return = "$item[1] $item[2] $item[3] $item[4] $item[5]"; } #outputs: #tag: tag 1 #tag: tag 2 #tag: tag 3 b #tag: tag 3 a ARRAY(0x1a55ad8) tag 3 c #tag: tag 4 b #tag: tag 4 d #tag: tag 4 c # ARRAY(0x1a8f664) tag 4 e # #tag: tag 4 a # ARRAY(0x1a8f670) tag 4 f # raw : m{([^<]*)} stag : m{} etag : m{} )); #slurp mode local $/=''; $parser->start(); __DATA__ tag 1 notatag 1 tag 2 notatag 2 tag 3 a tag 3 b tag 3 c notatag 3 tag 4 a tag 4 b tag 4 c tag 4 d tag 4 e tag 4 f notatag 4