use warnings;
use strict;
use HTML::Parser;
my $p = HTML::Parser->new(
api_version => 3,
unbroken_text => 1 );
$p->handler(text => sub {
my ($text) = @_;
# ### Your filter here ###
$text=~s/foo/bar/g;
print $text;
}, 'text');
$p->handler(default => sub {
print shift;
}, 'text');
my $infile = '/tmp/in.html';
my $outfile = '/tmp/out.html';
open my $out, '>', $outfile
or die "open $outfile: $!";
# "select" redirects the "print"s
my $previous = select $out;
$p->parse_file($infile);
close $out;
select $previous;
print "$infile -> $outfile\n";