当从Perl模块调用方法时,为什么’::’和’ – >’可互换地工作(有点)?

前端之家收集整理的这篇文章主要介绍了当从Perl模块调用方法时,为什么’::’和’ – >’可互换地工作(有点)?前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我一直在::与 – 混淆 – >从模块调用子程序时.我知道::与路径和模块/子程序的位置更相关,而且 – >用于对象,但我真的不明白为什么我看似可以互换它并没有立即出现错误.
我有perl模块,它们是更大包装的一部分,例如FullProgram ::第一部分

我只是想要掌握模块,但是当谈到Perl对象时,我仍处于不稳定状态,但我不小心这样做了:

FullProgram::Part1::subroutine1();

代替

FullProgram::Part1->subroutine1();

所以,当我将散列引用传递给子程序1时,一直小心使用$class / $self来处理对象引用并意外地使用::我最后拉出我的头发,想知道为什么我的哈希引用似乎消失了.我已经吸取了教训,但我真的想解释一下这种差异.我已经阅读了perldocs和各种网站,但我没有看到两者之间的任何比较(相当难以谷歌…)
所有的帮助表示赞赏 – 总是很了解我在做什么!

解决方法

FullProgram::Part1::subroutine1();

使用空参数列表调用包FullProgram :: Part1的子例程子例程1

FullProgram::Part1->subroutine1();

使用包名称作为第一个参数调用相同的子例程(请注意,当您进行子类化时,它会变得更复杂一些).这种语法由构造函数方法使用,这些方法需要类名来构建子类的对象,如

sub new {
    my ($class,@args) = @_;
    ...
    return bless $thing,$class;
}

仅供参考:在Perl OO中,您会看到$object->方法(@args),它使用对象(一个有福的引用)作为第一个参数而不是包/类名来调用Class ::方法.在这样的方法中,子例程可以这样工作:

sub method {
    my ($self,$foo,$bar) = @_;
    $self->do_something_with($bar);
    # ...
}

这将调用子例程do_something_with,并将对象作为第一个参数再次跟随$bar的值,这是您最初传递给@args中的方法的第二个列表元素.这样对象本身就不会丢失.

有关在调用方法时继承树如何变得重要的更多信息,请参阅ikegami’s answer

猜你在找的Perl相关文章