调用 perl 匿名子程序,其引用保存在散列中

call perl anonymous subroutine whose reference is maintained in a hash

如何调用其引用在散列中维护的 perl 匿名子例程?

这是代码

#!/usr/bin/perl -W

use strict;
use warnings 'FATAL';
use diagnostics;
use utf8;


sub fn {
  my $href = $_[0];

  my %h = %{ $href };

  print %h;

  my $cref = $h{'p'};

  &$cref();
}


fn p => sub { print "inside anon function\n" };


1;

谢谢你的时间。

您的子期望传递哈希引用,但您没有传递哈希引用。您传递一个字符串 (p) 和一个代码引用。那是因为

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 内部构建哈希。如果你想在外部构建散列并传递对它的引用,它看起来像这样:

sub fn {
   my $href = $_[0];
   my $cref = $href->{p};
   $cref->();
}

fn { p => sub { print "inside anon function\n" } };

我避免制作无用的散列副本 (my %h = %{ $href };)。


&$cref()(但不是 &$cref)也可以。我只是更喜欢箭头符号。