在Perl中,您如何动态选择要用作回调的方法?

Rob*_*t P 2 perl reference callback package

在Perl中,如果其包已知,则指定回调或代码引用是非常简单的:

package Foo;

sub foo { print "in foo" }

# and then
package main;

sub baz {
    my $code = shift;
    $code->();
}

baz( \&Foo::foo );
Run Code Online (Sandbox Code Playgroud)

这打印in foo.

让我们说你有一个对象,如此琐碎,像这样:

package Foo;

sub new { bless {}, shift }
sub bar { print "in bar" }
sub baz { print "in baz" }
Run Code Online (Sandbox Code Playgroud)

你可以使用上面的方法查找方法(\&Package:Method)并调用它

package main;
my $foo = Foo->new();
my $ref = \&Foo::bar;
$foo->$ref();
Run Code Online (Sandbox Code Playgroud)

但有时(好吧,经常)你不知道明确的类型.比方说有Foo,Bar,Baz,,他们都有自己的blat方法.您希望基于对象而不是包来获取对适当方法的引用.你会怎么做?

Tan*_*lus 8

my $ref = $obj->can('blat');
Run Code Online (Sandbox Code Playgroud)

如果$ ref是undef,你的对象就不能反对.如果$ ref不是undef,它是对有问题的函数的有效CODE引用,适用于调用"$ obj - > $ ref(@args)".