If you modify your code to output the content of the incoming argument array,
sub parseAutorep {
print join "\n", map defined ? "'$_'" : '<undef>', @_;
}
your output will be
'Util'
'parse'
This is because (as documented in
perlsub):
If a subroutine is called using the & form, the argument list is optional, and if omitted, no @_ array is set up for the subroutine: the @_ array at the time of the call is visible to subroutine instead. This is an efficiency mechanism that new users may wish to avoid.
The solution is to include parentheses in your call if you really want a null argument list. Alternatively, if you'd like the option of passing additional arguments, you could just shift both the package and subroutine name off the argument stack:
sub dispatch {
my ($self, $fname) = (shift,shift);
&{$dispatchTable{$fname}};
}