2014-11-22 92 views
1

我想创建属于对象(非静态)而不是类的变量。在我的下面的代码中我尝试了一些东西。Perl创建类变量而不是实例变量

#!/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 

回答

4

更改next_move到:

sub next_move{ 
    my ($self)[email protected]_; 
    $self->{_MOVE}++; 
    print $self->{_MOVE}." "; 
} 

你应该使用已经抓住了这个 “使用严格的;”在你的代码中。

+1

谢谢。我刚开始学习Perl,不知道严格。将从现在开始使用它。 – Ruturaj 2014-11-22 19:47:19

+1

@Ruturaj:你必须在每个Perl程序的开头都使用strict和'warnings'。命令行上的-w选项(或程序文件的shebang行)不是最佳实践。您还需要使用'my'将所有变量声明为尽可能接近它们的第一个使用点。最好使用'++ $ self - > {_ MOVE}'而不是'$ self - > {_ MOVE} ++'。 C++编程语言的名字让每个人都陷入了坏习惯! – Borodin 2014-11-22 22:07:02

+0

我现在使用严格和警告。谢谢。 – Ruturaj 2014-11-22 22:28:39

5

您应该使用strictwarnings

您忘记了初始化方法参数列表中的$self变量。

因此,Perl只是创建了一个名为$self的包变量,指向一个匿名hashref,并在那里自动检验了条目_MOVE

另外,不要使用indirect object notation

的问题是,Perl的需要做出一些假设在编译时来澄清对第一种形式,所以它往往是脆弱的,并产生硬跟踪下来的错误。

0

我建议添加“使用警告;使用严格;”到代码。 然后做一个perl -cw来查看是否有任何错误。然后你需要使用“my”声明你的$ animal1和$ animal2,即“my $ animal1 = new Animal();”

此外,添加我在“$ self - > {_ MOVE} ++;”之前“在动物类。

+0

如果包含'use warnings',那么'-cw'中的'w'是不必要的。 – 2014-11-22 20:40:22

+0

谢谢你指出,戴夫。你知道的旧习惯。 :) – Freddy 2014-11-22 21:31:01