Вызовите анонимную подпрограмму Perl, чья ссылка поддерживается в хэше - PullRequest
2 голосов
/ 06 ноября 2019

Как мне вызвать анонимную подпрограмму 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;

Спасибо за ваше время.

1 Ответ

6 голосов
/ 06 ноября 2019

Ваша подпрограмма ожидает, что ей будет передана ссылка на хеш, но вы не передадите ссылку на хеш. Вы передаете строку (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) тоже хорошо. Я просто предпочитаю обозначение стрелки.

...