use CGI qw/ :standard /; use Data::Dumper; use HTML::TokeParser; my $file = param('file'); # user defined tags. my @tags = grep /\Atag\d+\z/, param; my %text; foreach my $tag_name ( map param($_), @tags ) { # Is there a better way to rewind the parser? my $html = HTML::TokeParser->new($file) or die "Cannot parse $file"; print "$tag_name\n"; while ( my $tag = $html->get_tag($tag_name) ) { $text{$tag_name} = $html->get_trimmed_text("/$tag_name"); } } print Data::Dumper->Dump( [ \%text ], [qw( text )] );