perl - 访问要在外部显式调用的包中的 Moose 对象

标签 perl moose

对于 Moose 包,我尝试在 Perl(非 moose)中创建一个对象,然后尝试访问外部方法。解释这种情况的代码在这里。

package person;
{
    use Moose;
    sub test {
        print "my test print";
    }
}

package people {
    use person;
    my $obj = person->new();
}

$people::obj->test()

执行此 perl 代码时出现以下错误。

Can't call method "test" on an undefined value at test.pm 

我在这里遗漏了什么吗?

最佳答案

您从未将任何内容分配给 $people::obj。您将一些东西分配给一个名为 $obj 的不相关词法变量,这个变量在程序到达方法调用时甚至不存在。词法变量(例如那些由 my 创建的变量)被限制在它们所在的最里面的 curl 中,也就是说它们只在那里可见(可访问)。

修复:

package Person;
{
    use Moose;

    sub test {
        print "my test print";
    }
}

package People {
    my $obj = person->new();

    sub get_person {
       return $obj;
    }
}

People->get_person->test();

注意事项:

  • 删除了 use person;,它要么阻止程序编译,要么无意中执行了一些可能存在冲突的代码。
  • 小写模块名称保留用于编译指示。
  • 我本可以将词法变量更改为包变量,但使用全局变量是一种不好的做法。使用方法(或子方法)可以使将来的事情变得容易得多。
  • 小心将多个包/类放在一个文件中。有陷阱。

关于perl - 访问要在外部显式调用的包中的 Moose 对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62527023/

相关文章:

perl - 如何检测标准输出是否连接到 Perl 中的 tty?

perl - 哪些推荐的 Perl 模块可以序列化 Moose 对象?

perl - 在 Moose 中,如何判断一个对象的类是否是另一个对象类的子类?

perl - 我可以在 Moose 中重载方法吗?

java - 什么是操作 Apache2 配置文件的好库?

regex -\d+ 正则表达式忽略开头的减号

perl - 为什么 Moose 的构建器采用字符串值?

perl - 如何访问我的 Moose 角色所应用的模块的元类?

Android cgi web server写文件和加载perl脚本

perl base64 使用 url 安全字符编码