为什么我不能在新的内部初始化成员变量?

时间:2013-10-18 20:46:52

标签: perl class object perl-module

我试图在Perl中找不到OO。我做了以下琐碎的课程:

#/usr/bin/perl  
package Tools::Util;  
use strict;  
use warnings;  

my $var;  

sub new {  
    my ($class, $arg) = @_;   
    my $small_class = {  
        var => $arg,  
    };  
    return bless $small_class;    
}  

sub print_object {  
    print "var = $var\n";  #this is line 20   
}  

1;  

这是一个测试脚本:

#!/usr/bin/perl  
use strict;  
use warnings;  
use Tools::Util;  

my $test_object = new Tools::Util("Some sentence");  
$test_object->print_object();  
use Data::Dumper;  
print Dumper($test_object);  

我得到的结果是:

Use of uninitialized value $var in concatenation (.) or string at Tools/Util.pm line 20.   
var =   
$VAR1 = bless( {  
                 'var' => 'Some sentence'   
               }, 'Tools::Util' );  

我无法理解这一点。我认为Perl中的对象是哈希值,因此我可以使用相同的名称访问/初始化成员变量而不使用$。为什么在这种情况下$var没有初始化,但是我转储的哈希包含值?
我应该如何使用/初始化/处理成员变量以及我在这里误解了什么?

2 个答案:

答案 0 :(得分:4)

$var是词汇类变量,在您的示例中未定义。

你可能想要:

sub print_object {  
    my $self = shift;
    print "var = $self->{var}\n";
}

答案 1 :(得分:3)

Perl不像您习惯的那样处理对象方法。

您是否熟悉许多面向对象语言使用的隐式this参数?如果没有,现在是阅读它的好时机。

这是一个五秒钟的介绍,掩盖了细节:

//pretend C++

//this function signature
MyClass::MyFunction(int x);

//is actually more like the following
MyClass::MyFunction(MyClass this, int x);

当您访问班级的实例成员时,my_var相当于this.my_var

在Perl中,您可以手动执行此操作!变量$var 等同于$self->{var}

您的祝福对象实际上是一个哈希引用,可以这样访问。当您调用$test_object->print_object()时,sub会将$test_object的值作为其第一个参数。大多数Perl程序员都这样处理:

sub my_method {
    my $self = shift; #shift first argument off of @_
    print $self->{field};
}

考虑到这一点,您可能应该重写print_object子以匹配mpapec's answer

进一步阅读:perlsubperlobj

相关问题