use HTML::TokeParser::Simple; my $p = HTML::TokeParser::Simple->new( file => 'test_data.html' ); my $t; #token; my @text; #get all text between pre tags while ($t = $p->get_token) { next unless $t->is_start_tag('pre'); my $content; while ($t = $p->get_token) { last if $t->is_end_tag('pre'); $content .= $t->as_is; } push @text, $content; }