【发布时间】:2019-12-23 21:36:39
【问题描述】:
如果是重复的,请说出来。我还没有找到它,仅适用于 PHP,但适用于 Perl。所以如果我能写出全名,例如Class::sub() 或$Class::scalar,我可以写Class->sub 或$Class->scalar(如果我有used 或required 和Class),perl 的主要区别是什么?
问题是: 类 Animal.pm:
#!/usr/bin/perl -w
package Animal;
our $VERSION = '0.01';
sub speak {
my $class = shift;
print "a $class goes ", $class->sound;
}
sub sound{
die "You have to defined sound() in a subclass";
}
然后上课 Horse.pm:
#!/usr/bin/perl -w
package Horse;
use Animal;
our @ISA = qw[Animal];
our $VERSION = '0.01';
sub sound { 'neight' }
1
如果我在主程序中这样做:
#!/usr/bin/perl -w
BEGIN{ unshift @INC, 'dirWithModules' }
use Horse; use Animal;use Cow;
Animal::speak('Horse');
输出---->"a Horse goes neight"
但是如果我 OD
#!/usr/bin/perl -w
BEGIN{ unshift @INC, 'dirWithModules' }
use Horse; use Animal;use Cow;
Animal->speak('Horse')
输出--->"You have to defined sound() in a subclass at Animal.pm"
所以我的问题是,如果我从Animal.pm 的Animal.pm 类Horse.pm 引用我的方法,使用::,双冒号,NO PROBLEM - 它会打印声音。但是,如果我尝试使用 -> 箭头引用 sub,$class 不会被继承 - 也就是说,$class 本身是 Animal.pm,但不是作为发送的参数 ('Horse')。那么:: 和-> 有什么不同呢?
【问题讨论】:
-
阅读官方文档是个好主意:perldoc.perl.org/perlmod.html
-
@MiguelPrz 文档对于初学者来说可能相当吓人。由于我有经验,我知道打开 perlop(找到
->),这导致我进入 perlobj。知道答案的人说“rtfm”很容易,但初学者很难找到相关文档的位置/内容(尤其是在这种情况下,因为答案分为 perlmod 和 perobj)。 -
@dada 和 OP,一个很好的起点,
perlobj第一行提到的就是教程perlootut。
标签: perl