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

标签 perl hash subroutine

我如何调用其引用在散列中维护的 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)也可以。我只是更喜欢箭头符号。

关于perl - 调用 perl 匿名子程序,其引用保存在散列中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58725805/

相关文章:

mysql - SHA256/SHA512 : MySQL Code for Password Hashing and Salting

recursion - 如何防止递归 Fortran 子例程中定义的变量在内部调用时更新?

perl - 为什么使用自动激活文件句柄的三参数开放调用是 Perl 最佳实践?

perl - 如何从Perl XS查找当前软件包名称?

使用 HMAC+nonce 存储 PHP 密码 - nonce 随机性重要吗?

java - sha-1 是否会为小于 160 位的输入消息产生冲突?

perl - 我怎样才能抽出未定义的子程序?

perl - 此处正确关闭是什么意思

arrays - 如何查找数组的值是否是 Perl 中散列的键?

perl - 是否有一个 perl 模块来验证存储在 "{crypt}hashedpassword" "{ssha}hashedpassword" "{md5}hashedpassword"中的密码