Perl创建类变量而不是实例变量

时间:2014-11-22 19:34:09

标签: perl

我正在尝试创建属于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

3 个答案:

答案 0 :(得分:5)

您应该使用strictwarnings

您忘记从方法中的参数列表初始化$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;在动物类。