如何在Perl中将代码引用用作回调函数?

8

我在我的类中有以下代码:


sub new {
    my $class = shift;
    my %args  = @_;
    my $self  = {};
    bless( $self, $class );
    if ( exists $args{callback} ) {
        $self->{callback} = $args{callback};
    }
    if ( exists $args{dir} ) {
        $self->{dir} = $args{dir};
    }
    return $self;
}

sub test {
  my $self = shift;
  my $arg  = shift;
  &$self->{callback}($arg);
}

并且有一个包含以下代码的脚本:


use strict;
use warnings;
use MyPackage;

my $callback = sub {
   my $arg = shift;
   print $arg;
};

my $obj = MyPackage->new(callback => $callback);


但是我收到了以下错误信息:
Not a CODE reference ...

我错过了什么?打印ref($self->{callback})会显示CODE。如果我使用$self->{callback}->($arg),它可以正常工作,但我想使用另一种调用代码引用的方法。

1
为什么你想要另一种解引用代码引用的方式?使用有效的方法并继续解决下一个问题。 :) - brian d foy
1个回答

18

这个“&”符号只绑定到$self而不是整个东西。你可以在返回引用的那部分周围加上花括号:

&{$self->{callback}}($arg);

但是这个

$self->{callback}->($arg);

通常认为使用“is generally considered cleaner”更加规范,为什么你不想使用它?


我的 Perl 有点生疏。我知道我漏掉了什么,想找出是什么:)。谢谢你,Adam! - Geo

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接