2012-10-31 20 views
1

我做了一个Perl模块和我仍然得到认真处理的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) 
} 

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

+1

参见[如何使Perl模块中的私有函数?(http://stackoverflow.com/questions/451521/how-do-i-make-private-functions-in-a-perl -module)。 – qqx

+0

这实际上是非常有益的,解释了为什么我总是看到'在一些地方_'使用的,而不是别人+1 – dgBP

+1

另一件事学习Perl中的“新东西”是坏的:http://shadow.cat/blog/matt- s-trout /间接但还是致命的/还有很多其他好文章 –

回答

5

有没有这样的事情在Perl对象内部/私有方法。通常的做法是启动任何不应公开使用下划线的方法,但这不是以任何方式实施的。还要看看驼鹿 - 它需要很多OO perl的麻烦。

至于你的问题显示了如何在一个模块的方法可以调用另一个模块的方法,具有访问这两个对象数据。我再次强烈建议你使用Moose!

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

    return $self->_privateSub(); 
} 

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

    return $self->{name}; 
} 
+0

哦有趣 - 我尝试通过'$ self',它似乎没有做任何事情。我会和那玩,谢谢 – dgBP

+3

'$ self'总是持有祝福的对象本身。如果你在像'$ obj-> do($ stuff)'这样的对象上调用方法,那么''>''让Perl使用'$ obj'作为'do'子句的第一个参数,因此它需要'my $ self,$ stuff)= @ _'。你可以用内部方法来做同样的事情。请注意,您可以**也可以使用'do($ obj,$ stuff)'显式调用一个方法。这有效,但看起来很丑,没有人会明白你在做什么,所以**不要这样做**。 – simbabque

+0

驼鹿+1。另外看[Moo](http://p3rl.org/Moo),它更轻。 – simbabque

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 

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

也许你想别的东西。如果是这样,请尝试重新提出您的问题。

+0

嗯,我之前有类变量,但被告知我应该制作一个对象并引用它。我知道我可以将它们重新放回到变量中,但似乎毫无意义地使用了一个对象。我在后面的模块中将这些变量作为if语句的一部分,并将它们用作另一个模块方法的参数,所以使用一个对象似乎过于复杂。感谢您的回复:) – dgBP