perl - 如何将模块的函数作为对 Perl 中另一个模块的引用传递?

标签 perl oop reference function-pointers perl-module

如何在另一个模块的函数调用中传递对模块函数的引用作为参数?
我尝试了以下(简单示例):
这是具有函数 (process_staff) 的模块,该函数将函数引用 (is_ok) 作为参数。

#!/usr/bin/perl  
use strict;  
use warnings;  

package Objs::Processing;  

sub new {  
    my ($class) = @_;  
    bless {} ;      
}  

sub process_staff {  
    my ($employee, $func) = @_;  
    if($func->is_ok($employee)) {  
        print "Is ok to process\n";  
    }  
    else {  
        print "Not ok to process\n";  
    }  
}  
1; 

这是实现传递函数的模块(is_ok)
#!usr/bin/perl  
use strict;  
use warnings;  

package Objs::Employee;  

my $started;  

sub new {  
    my ($class) = @_;  
    my $cur_time = localtime;  
    my $self = {  
        started => $cur_time,  
    };  
    print "Time: $cur_time \n";  
    bless $self;  
}  

sub get_started {  
    my ($class) = @_;  
    return $class->{started};  
}  

sub set_started {  
    my ($class, $value) = @_;  
    $class->{started} = $value;  
}  

sub is_ok {  
    my ($emp) = @_;  
    print "In is ok I received:\n";  
    use Data::Dumper;   
    print Dumper($emp);  
    return 1;  
}   

这是我运行的测试脚本:
#!/usr/bin/perl  
use strict;  
use warnings;  

use Objs::Manager;  
use Objs::Processing;  

my $emp = Objs::Manager->new('John Smith');    
use Data::Dumper;    
print Dumper($emp);  

my $processor = Objs::Processing->new();   
$processor->process_staff(\&$emp->is_ok);   #error is here  

我得到一个:
Not a CODE reference at testScript.pl line 14.  

我也试过:$processor->process_staff(\&$emp->is_ok());但也还是不行。
我在这里做错了什么

最佳答案

您似乎想要传递一个对象和一个方法来调用它;最简单的方法是:

$processor->process_staff( sub { $emp->is_ok } );

其中 process_staff 看起来像:
sub process_staff {
    my ($self, $func) = @_;
    if ( $func->() ) {
        ...

或者您可以分别传递引用和对象:
sub process_staff {
    my ($self, $emp, $method) = @_;
    if ( $emp->$method() ) {
    ...

$processor->process_staff( $emp, $emp->can('is_ok') );

关于perl - 如何将模块的函数作为对 Perl 中另一个模块的引用传递?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19082114/

相关文章:

python - 在Python中复制复合对象

Perl -M 标志,未初始化的值?

xml - Perl 编辑 XML 文件 : search and replace

regex - 是否存在用于 enzyme 促切割的正则表达式?

excel - VBA 是 OOP 语言吗?它是否支持多态性?

python - 根据参数类型调用类 A 的方法

javascript - this 与 Javascript 原型(prototype)

c++ - 将来自 switch 语句的信息存储到变量中?

perl - 哈希键中哪些字符有效?

C++ - 方法实现取决于是否设置了成员引用变量