2014-02-16 152 views
0

我有一个模块,当我试图让在初始化设置默认属性,是给下面的错误子程序调用时get_name无法在Perl的对象属性返回默认值

 Use of uninitialized value 

示例代码

 package test; 
    #.... 
    #.... 
    sub new { 
     my ($class) = @_; 
     my $self = {}; 
     bless $self,$class; 
     $self->_initialize(); 
     return $self; 
    } 

    sub _initailalize { 
     my($self) = @_; 
     $self = { 
        _name => 'NA' 
     }; 
    } 

    sub get_name { 
       return $_[0]->{_name}; 
    } 

需要宝贵的输入。

+3

“我的”变量$ self在相同范围内声明前面的声明https://eval.in/102140 –

回答

5

您正在_initialize的本地范围内重新定义$ self并分配一个新的hashref。这样你就不会将_name键添加到祝福的物体上。 _initialize完成后,您新分配的$self(带有简单的hashref)就消失了。因此在get_name它不能访问密钥_name

sub _initailalize { # btw typo here 
    my ($self) = @_; 
    $self->{_name} = 'NA'; 
} 

如果你这样做,你需要在每一行上分配每个成员。


作为一个建议,这种OO的内置风格非常繁琐。试试看Moose或它的衍生品,因为它们非常强大。