Perl包实例可以维护不同的变量值吗?

时间:2014-01-17 12:50:34

标签: perl oop

我的目标是使用相同的代码来维护单独的变量堆栈。真正的子需要多次调用,每个实例都有自己的数组。我对面向对象解决方案的尝试失败了:

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等),所有工作都按预期工作,所以我只是想简化代码维护。我错过了上面的东西,还是走错了方向?

2 个答案:

答案 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