首页 > 解决方案 > 调用 perl 匿名子例程,其引用保存在散列中

问题描述

我如何调用 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;

谢谢你的时间。

标签: perlhashsubroutine

解决方案


您的 sub 期望传递一个哈希引用,但您没有传递一个哈希引用。您传递一个字符串 ( 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)也很好。我只是更喜欢箭头符号。


推荐阅读