use strict; use Parse::RecDescent; my $parser = Parse::RecDescent->new(q( start: part(s) { print join("\n",@{$item[1]}); } part : stag part(s) etag { $return = "$item{stag} " . join(" ", @{$item[2]}) . " $item{etag}"; } | stag data etag { $return = "$item{stag} $item{data} $item{etag}"; } | data data : m{([^<]+)} stag : m{} etag : m{} )); $parser->start(); __DATA__ Some content some more content #### Some content some more content