Perl OOP方法条件$ self-> {$ tag}

时间:2017-02-16 03:42:55

标签: perl

我正在学习perl并查看一些旧的OOP代码。 在pl中,有一行调用pm文件中的函数。 喜欢

my $id = new ABC::Data::InstallData();
my $startMenu = $id->getData('menu');

在pm文件中,功能如下:

package ABC::Data::InstallData;

$debug = 1;
sub getData {                            
    my($self, $tag) = @_;                   
    #print "----1------$self-----------\n";
    #print "----2------$tag-----------\n";

    if ( $debug && ! defined $self->{$tag} ) {
       $logger->debug("Undefined variable $tag = $self->{$tag}");     
    }

    if ( $debug ) {
       $logger->debug("Exiting ABC::Data::InstallData::getData");     
    }
    return $self->{$tag};                                              
}

如您所见,有2行打印可以输出类名和参数inputed。 但我不明白$self->{$tag}的含义,有人可以帮忙吗?

1 个答案:

答案 0 :(得分:0)

$self->{tag}

...在这种情况下是一个类属性。这似乎是一个类中的setter / getter方法。以下是此操作的一个示例(详细):

sub new {
    my ($class, $arg) = @_;
    my $self = bless {}, $class;
    $self->arg($arg);
    return $self;
}
sub arg {
    my ($self, $arg) = @_;
    if (defined $arg){
        $self->{arg} = $arg;
    }
    return $self->{arg};
}

然后,当我使用该模块时:

my $object = Blah->new(2);
print $object->arg;

# you can even access object attributes outside of the
# documented accessor methods, but it breaks encapsulation, 
# so you just don't do it

print $object->{arg};

输出:

2

本质上,子例程getData()返回$self->{tag}的值,其中$self是类的对象(并且是哈希引用),tag是该对象的属性(填充到祝福的哈希引用$self(对象))。当您使用参数调用它时,设置$self->{tag},然后返回,并在没有参数的情况下调用,不会完成属性设置,并返回先前的(当前)值。