dgB*_*gBP 1 oop perl module object
我正在制作一个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};
}
Run Code Online (Sandbox Code Playgroud)
当我调用模块并从另一个文件访问它时,我可以使用该对象,但我想在模块代码中的其他区域使用对象中的数据.
所以我这样做没有问题:
my $new_object = new ProgramTest; # ProgramTest being the module/package
my $name = get_name();
Run Code Online (Sandbox Code Playgroud)
但是我想$self在"模块内部"方法中使用元素,这种方法永远不会被外部脚本访问.所以我想要这样的东西:
sub get_variables {
return (name); # I don't know how to get the name here
# (I plan to have other variables, too)
}
Run Code Online (Sandbox Code Playgroud)
我可能错过了一些明显的东西(我确信当我看到解决方案时我会踢自己),所以任何帮助都表示赞赏!我希望这样,以便模块的其余部分可以使用变量(不更改),因为有条件依赖于它们的值.
Perl对象中没有内部/私有方法.通常的做法是启动任何不应与下划线一起公开使用的方法,但这不会以任何方式强制执行.还要看看驼鹿 - 它需要很多OO perl的麻烦.
关于您的问题,下面显示了一个模块方法如何调用另一个模块方法,两者都可以访问对象数据.我真的会建议你使用驼鹿!
sub publicSub{
my ( $self ) = @_;
return $self->_privateSub();
}
sub _privateSub{
my ( $self ) = @_;
return $self->{name};
}
Run Code Online (Sandbox Code Playgroud)
我想你想要类变量.它们是类的全局,类的所有实例(即您创建的所有对象)都可以看到它们.在这种情况下,全局意味着它们处于最左侧的词汇范围,因此所有潜艇都可以看到它们.
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
Run Code Online (Sandbox Code Playgroud)
但我不明白你为什么要那样做.它没有意义(除非你想要一个对象计数器).不要将它用于配置值,或者您不能将对象用于同一类的不同目的.
也许你想要别的东西.如果是这样,请尝试重新解释您的问题.