my $code2 = $html->look_down(
_tag => q{input},
type => q{hidden},
name => q{code2}
)->attr(q{value});
schlägt fehl, weil es kein entsprechendes input-Element gibt. look_down gibt dann undef zurück und darauf rufst Du dann ->attr auf - das klappt natürlich nicht.
Prüf, ob look_down einen Wert zurückgibt, zB
my $code2 = "";
if(my $code2input = $html->look_down(
_tag => q{input},
type => q{hidden},
name => q{code2})) {
$code2 = $code2input->attr(q{value});
}