use Carp; use strict; use warnings; my $page = join('', "This is some filler.\n" x 20000, "\n", "This is some filler.\n" x 20000, "\n", "This is some filler.\n" x 20000, "\n", "This is some filler.\n" x 20000, "\n", "This is some filler.\n" x 20000); print "Calling process_section. Length of page=[" . length($page) ."]\n"; my $newpage = process_section(\$page, {test1 => 1}); print "Done. Length of newpage=[" . length($newpage) ."]\n"; sub process_section { my ($page, $hashref) = @_; my $return = ''; while ($$page=~/\G(.*?)\n?/igcs) { $return .= $1; my $tag = $2; my $post = pos($$page); if ($$page=~/\G(.*?)<\/SECTION>\n?/igcs) { $return .= $1 if exists $hashref->{$tag}; next; } my $excerpt = substr($$page, $post, 100); print STDERR "\n"; Carp::carp("Warning: Unbalanced SECTION tags. Fix the template! Error near: $excerpt\n"); pos($$page) = $post; } $return .= substr($$page, pos($$page)) if (pos($$page) < length($$page)); return $return; }