我正在尝试创建属于object(非静态)而不是class的变量。在我的下面的代码中,我尝试了一些东西。
#!/usr/bin/perl -w
use Animal;
sub main{
$animal1 = new Animal();
$animal2 = new Animal();
for (my $i=0; $i < 10; $i++) {
$animal1->next_move();
$animal2->next_move();
}
print "\n";
}
main();
我的动物类看起来像这样
#!/usr/bin/perl -w
#
#
# Animal.pl
package Animal;
sub new
{
my $class = shift;
my $self = {
_MOVE => 0,
};
bless $self, $class;
return $self;
}
sub next_move{
$self->{_MOVE}++;
print $self->{_MOVE}." ";
}
1;
我的输出是
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
虽然我的预期是
1 1 2 2 3 3 4 4 5 5 6 6 7 7 8 8 9 9 10 10
答案 0 :(得分:5)
您忘记从方法中的参数列表初始化$self
变量。
因此,Perl刚刚创建了一个名为$self
的包变量,指向一个匿名的hashref,并在其中自动生成一个条目_MOVE
。
另外,请勿使用indirect object notation:
问题在于Perl需要在编译时做出一些假设来消除第一种形式的歧义,因此它往往很脆弱并且产生难以追踪的错误。
答案 1 :(得分:4)
将next_move更改为:
sub next_move{
my ($self)=@_;
$self->{_MOVE}++;
print $self->{_MOVE}." ";
}
你可以通过使用&#34; use strict;&#34;在你的代码中。
答案 2 :(得分:0)
我建议添加&#34;使用警告;使用严格;&#34;到代码。 然后执行perl -cw以查看是否有任何错误。
然后你需要使用&#34;我的&#34;声明你的$ animal1和$ animal2,即&#34;我的$ animal1 = new Animal();&#34;
另外,将我添加到&#34; $ self-&gt; {_ MOVE} ++;&#34;在动物类。