我一直在::与 – 混淆 – >从模块调用子程序时.我知道::与路径和模块/子程序的位置更相关,而且 – >用于对象,但我真的不明白为什么我看似可以互换它并没有立即出现错误.
我有perl模块,它们是更大包装的一部分,例如FullProgram ::第一部分
我有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!