3

我试图在 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未初始化但我转储的哈希包含该值?
我应该如何使用/初始化/处理成员变量,我在这里误解了什么?

4

2 回答 2

4

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

你可能想要:

sub print_object {  
    my $self = shift;
    print "var = $self->{var}\n";
}
于 2013-10-18T20:49:14.977 回答
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_objectsub 以匹配mpapec 的 answer

进一步阅读:perlsubperlobj

于 2013-10-18T21:37:36.013 回答