in reply to mysterious hash ref result

Perhaps param() is using a bare return on error. A bare return returns undef or the empty list, depending on the context in which the subroutine was called! Your second example calls param() in scalar context, so a bare return would give you undef; Your first example calls param() in list context, so a bare return would give you (). To help confirm my diagnosis, try replacing your anon-hash constructors {...} with anon-array constructors [...], and impose scalar context by using scalar directly. By avoiding the hash, you will prevent confusion from the random hash ordering in your dump.
use strict; use warnings; ... my $dump_string = Dumper [ ### Uncomment one or the other of these two lines. # edit_usr_id => $self->client->param( 'edit_usr_id' ), edit_usr_id => scalar( $self->client->param( 'edit_usr_id' ) ), mode => $self->client->param( 'mode' ) ]; $self->log(LOGDEBUG, 'EDIT_USER: '.$dump_string ));
It should give something like:
EDIT_USER: $VAR1 = [ 'edit_usr_id', undef, 'mode', 'add', ];
or:
EDIT_USER: $VAR1 = [ 'edit_usr_id', 'mode', 'add', ];
Also, you should have gotten a warning about 'Odd number of elements' in your hash assignment in your first example. You do have warnings turned on, don't you?