调用perl匿名子例程,其引用保留在哈希中

问题描述 投票:0回答:1

我如何调用其引用保存在哈希中的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;

感谢您的时间。

perl hash subroutine
1个回答
2
投票

您的子期望传递一个哈希引用,但是您不传递一个哈希引用。您传递一个字符串(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)也可以。我只喜欢箭头符号。

© www.soinside.com 2019 - 2024. All rights reserved.