Ваша подпрограмма ожидает, что ей будет передана ссылка на хеш, но вы не передадите ссылку на хеш. Вы передаете строку (p
) и код ref. Это потому, что
fn p => sub { print "inside anon function\n" };
совпадает с
fn "p", sub { print "inside anon function\n" };
Исправление:
sub fn {
my %h = @_;
my $cref = $h{p};
$cref->();
}
fn p => sub { print "inside anon function\n" };
Это создает хэш на внутренней стороне сабвуфера. Если бы вы хотели создать хеш снаружи и передать ссылку на него, это выглядело бы так:
sub fn {
my $href = $_[0];
my $cref = $href->{p};
$cref->();
}
fn { p => sub { print "inside anon function\n" } };
Я избегал делать бесполезную копию хеша (my %h = %{ $href };
).
&$cref()
(но не &$cref
) тоже хорошо. Я просто предпочитаю обозначение стрелки.