1

我正在制作一个 Perl 模块,但我仍在掌握 Perl 如何处理对象。这是new我为创建对象而编写的子代码,更新元素没有问题:

sub new {
    my $class = shift;
    my ($self) = {
        name => undef
    };
    bless($self, $class);
    return $self;
}
sub get_name {
    my $self = shift;
    $self->{name} = 'Eve';
    return $self->{name};
}

当我调用模块并从另一个文件访问它时,我可以很好地使用该对象,但我想在模块代码的其他区域使用对象中的数据。

所以我这样做没有问题:

my $new_object = new ProgramTest; # ProgramTest being the module/package
my $name = get_name();

但我想$self在“模块内部”方法中使用这些元素,外部脚本永远不会访问该方法。所以我想要这样的东西:

sub get_variables {
    return (name); # I don't know how to get the name here 
    # (I plan to have other variables, too)
}

我可能遗漏了一些明显的东西(我相信当我看到解决方案时我会踢自己),所以任何帮助表示赞赏!我想要这个,以便模块的其余部分可以使用变量(不改变),因为有些条件依赖于它们的值。

4

2 回答 2

6

perl 对象中没有内部/私有方法之类的东西。通常的做法是使用下划线开始任何不应公开使用的方法,但这不是以任何方式强制执行的。还请看一下 moose - 它从 OO perl 中消除了很多麻烦。

关于您的问题,下面显示了一个模块方法如何调用另一个模块方法,并且两者都可以访问对象数据。再次,我真的建议您使用 Moose!

sub publicSub{
    my ( $self ) = @_;

    return $self->_privateSub();
}

sub _privateSub{
    my ( $self ) = @_;

    return $self->{name};
}
于 2012-10-31T13:50:59.513 回答
5

我认为你想要类变量。它们对于一个类是全局的,并且该类的所有实例(即您创建的所有对象)都可以看到它们。在这种情况下,全局意味着它们处于最外部的词法范围,因此所有子都可以看到它们。

package ProgramTest;
my $everyone_can_see_this = 1; # lexical scope, but 'global' to the package

sub new {
    my $class = shift;
    my ($self) = {
        name => undef
    };
    bless($self, $class);
    return $self;
}
sub get_var {
    my $self = shift;
    return ++$everyone_can_see_this;
}

package Main;
my $o1 = ProgramTest->new;
my $o2 = ProgramTest->new;

say $o1->get_var;
say $o2->get_var;
say $o1->get_var;

__END__
2
3
4

但我不明白你为什么要这样做。这没有意义(除非你想要一个对象计数器)。不要将它用于配置值,否则您不能真正拥有用于同一类的不同目的的对象。

也许你想要别的东西。如果是这样,请尝试改写您的问题。

于 2012-10-31T13:43:46.910 回答