perl中双冒号和箭头的区别
如果是重复的,就说出来。我还没有找到它,只是针对PHP,而是针对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
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()”
因此,我的问题是,如果我引用classHorse.pm
iherited subspeak
fromAnimal.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, ...) = @_;
}