perl中双冒号和箭头的区别

perl中双冒号和箭头的区别,perl,Perl,如果是重复的,就说出来。我还没有找到它,只是针对PHP,而是针对Perl。因此,如果我可以写全名,例如Class::sub()或$Class::scalar,我可以写Class->sub或$Class->scalar(如果我有使用d或需要d类),perl的主要区别是什么 问题是: 下午三时三十分: #!/usr/bin/perl -w package Animal; our $VERSION = '0.01'; sub speak { my $class = shift; pri

如果是重复的,就说出来。我还没有找到它,只是针对PHP,而是针对Perl。因此,如果我可以写全名,例如
Class::sub()
$Class::scalar
,我可以写
Class->sub
$Class->scalar
(如果我有
使用
d或
需要
d
),perl的主要区别是什么

问题是: 下午三时三十分:

#!/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";
}
那么下午三点上课:

#!/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');
输出-->
“马嘶鸣”
但如果我是个瘾君子

#!/usr/bin/perl -w
BEGIN{ unshift @INC, 'dirWithModules' }
 use Horse; use Animal;use Cow;
Animal->speak('Horse')
输出-->
“您必须在Animal.pm的子类中定义sound()”

因此,我的问题是,如果我引用class
Horse.pm
iherited sub
speak
from
Animal.pm
中的方法,使用
,双冒号,则无问题-它将打印声音。但是,如果我尝试使用
->
箭头引用子对象,则
$class
不是继承的-也就是说,
$class
Animal.pm
本身,但不是作为参数发送的(
'Horse'
)。所以在什么是
->
不同的地方?

Foo->bar()
是一个方法调用

  • 如有必要,它将使用继承
  • 它将把发票(在
    ->
    的左侧)作为第一个参数传递。因此,
    bar
    应按如下方式编写:

    # Class method (Foo->bar)
    sub bar {
       my ($class, ...) = @_;
    }
    

Foo::bar()
是一个子调用

  • 它不会使用继承

阅读官方文档是个好主意:@MiguelPrz对于初学者来说,文档可能非常吓人。由于我有经验,我知道打开perlop(查找
->
),这使我找到了perlobj。对于知道答案的人来说,说“rtfm”很容易,但对于初学者来说,找到相关文档的位置/内容要困难得多(尤其是在这种情况下,因为答案分为perlmod和perobj)。@dada和OP,这是一个很好的开始,在
perlobj
的第一行中提到的是教程。
# Object method (my $foo = Foo->new; $foo->bar)
sub bar {
   my ($self, ...) = @_;
}