in reply to Dump the key value pairs in a hash

Well, yes, there's a rather easy fix. $self is a reference to the actual hash. You can convert ("dereference") it by writing %$self instead of %self (which is a variable of its own).

However, a better approach would be to use one of Perl's modules for that. Data::Dumper is in Perl core, Data::Dump or Data::Print need to be installed using your package manager or CPAN and provide "nicer" output. For Data::Dumper, use:

use Data::Dumper; print Dumper $self; print Dumper $args; print Dumper $e;

That should go a long way.