我的目标是使用相同的代码来维护单独的变量堆栈。真正的子需要多次调用,每个实例都有自己的数组。我对面向对象解决方案的尝试失败了:
package pkg_magic;
sub new{my $pkg={}; bless $pkg; return $pkg;}
my $keep;
sub set{my $self=shift; $keep=shift;}
sub show{my $self=shift; print"$self $keep\r\n";}
1;
两次来自:
#!/usr/bin/perl
use strict;
use warnings;
push(@INC,".");
use pkg_magic;
my $inst1=pkg_magic->new;
$inst1->set("inst1");
$inst1->show();
my $inst2=pkg_magic->new;
$inst2->set("inst2");
# call first instance, not second
$inst1->show();
exit;
输出:
pkg_magic=HASH(0x2020f88) inst1
pkg_magic=HASH(0x2020f88) inst2
显然,即使它被称为不同的对象,也会遇到相同的子。如果我将包代码复制到单独的文件并重命名subs(set1,set2等),所有工作都按预期工作,所以我只是想简化代码维护。我错过了上面的东西,还是走错了方向?
答案 0 :(得分:3)
包级变量只能有一个(全局)值,但是,如果将其移动到实例hashref中,则每个实例都可以有自己的值:
package pkg_magic;
sub new{my $pkg={}; bless $pkg; return $pkg;}
sub set{my $self=shift; $self->{keep}=shift;}
sub show{my $self=shift; print"$self $self->{keep}\r\n";}
1;
答案 1 :(得分:3)
您必须在对象哈希中设置对象属性,以便它们可以独立。
遵循传统的编码标准也更好,尤其是在寻求帮助时,以便大多数人都能轻松阅读您的代码。每行多个语句是坏主意。
也无需将.
推送到@INC
:默认情况下它已存在。
<强> pkg_magic.pm 强>
package pkg_magic;
use strict;
use warnings;
sub new {
my $self = {};
bless $self;
}
sub set {
my $self = shift;
$self->{keep} = shift;
}
sub show{
my $self = shift;
print $self->{keep}, "\n";
}
1;
<强> prog.pl 强>
use strict;
use warnings;
my $inst1 = pkg_magic->new;
$inst1->set("inst1");
$inst1->show();
my $inst2 = pkg_magic->new;
$inst2->set("inst2");
$inst1->show(); # call first instance, not second
<强>输出强>
inst1
inst1