【问题标题】:call perl anonymous subroutine whose reference is maintained in a hash调用 perl 匿名子例程,其引用保存在散列中
【发布时间】:2020-03-02 16:20:13
【问题描述】:

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

感谢您的宝贵时间。

【问题讨论】:

  • 对不起,但我不知道你到底想做什么......?根据Can't use string ("p") as a HASH ref ...,显示的程序失败。你能用语言表达你想要什么吗?
  • 至于你所说的,$h{key_with_sub}->(); ... 就是你所需要的吗?
  • @zdim 感谢您的回复。目标是调用匿名子例程。我期望&$cref() 应该可以工作。
  • 好的。所以:你传递给你的函数的是一个列表,正如@dgw 所说,p 和匿名子sub {...}(这只是一个引用,一个标量)。在 sub 中,您使用第一个参数 ($_[0]),所以这是 p,它只是一个字符串,只是一个字母。然后你尝试将它“取消引用”到一个哈希(%{ $href })——好吧,它不是一个引用......这是程序退出的错误。为什么你认为p 是一个 hashref?
  • ... 和 "p" => 1"p", 1 相同(一个列表)。看到它in perlop

标签: perl hash subroutine


【解决方案1】:

你的 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)也可以。我只是更喜欢箭头符号。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-12-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-09-08
    相关资源
    最近更新 更多