Perl объединяет аргументы подпрограммы в один список - Perl автоматически выполняет http://en.wikipedia.org/wiki/Apply для всех вызовов непрототипированных подпрограмм.Так, для случая $self->check_something (%hash, message => $input2);
%hash
сглаживается.
Так что если:
%hash = ( foo => 1, bar => 2 );
Ваш дополнительный вызов:
$self->check_something( foo => 1, bar => 2, message => $input2 );
Итак,если вы хотите передать свой хэш как отдельную сущность, вам нужно передать ссылку:
# Reference to hash:
$self->check_something( \%hash, message => $input2 );
# To pass an anonymous copy:
$self->check_something( {%hash}, message => $input2 );
# To expand hash into an anonymous array:
$self->check_something( [%hash], message => $input2 );
В большинстве случаев вам, вероятно, захочется сделать один из первых двух примеров, которые я показал.
Преимущество поведения сглаживания списков состоит в том, что очень просто создавать списки аргументов программно.Например:
my %args = (
foo => 'default',
bar => 'default_bar',
baz => 23,
);
$args{foo} = 'purple' if $thingy eq 'purple people eater';
my %result = get_more_args();
@args{ keys %result } = values %result;
my_amazing_sub_call( %args );