also mir scheint, dass du die parameter falsch einliest.
bei der handler-definition gibst du ja "tagname,self" an.
in der subroutine machst du dann aber als erstes
my $self = shift;
zweitens: sowohl im if als auch im elsif machst du ein shift.
nach dem if ist aber das argument schon geshifted, aber da du nur 2 argumente bekommst, holst du dir mit dem shift im elsif ein drittes, welches nicht existiert.
ist ne weile her, dass ich mit HTML::Parser gearbeitet habe, aber ich würde vermuten, dass das so gehen würde:
my ($tagname, $self) = @_;
if ($tagname eq "cc-name") {
...
}
elsif ($tagname eq "cc_info") {
...
}
...
ansonsten empfehle ich dir als anfänger noch ein tutorial wie z.b. Modern Perl.
eine liste findest du hier:
http://perl-tutorial.org/