Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Perl包实例可以维护不同的变量值吗?_Perl_Oop - Fatal编程技术网

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

Perl包实例可以维护不同的变量值吗?,perl,oop,Perl,Oop,我的目标是使用相同的代码来维护单独的变量堆栈。真正的sub需要多次调用,每个实例都有自己的数组。我尝试的面向对象解决方案失败: 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; 从以下地址拨打两次电话: #!/us

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

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

显然,正在访问同一个子对象,尽管它被称为不同的对象。如果我将包代码复制到单独的文件中,并重新命名sub(set1、set2等),所有这些都能按预期工作,那么我只是想简化代码维护。我是否遗漏了上面的内容,或者走错了方向?

包级别变量只能有一个(全局)值,但是,如果将其移动到实例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;

必须在对象哈希中设置对象属性,以便它们可以独立

坚持传统的编码标准也要好得多,尤其是在寻求帮助时,这样大多数人都可以轻松地阅读您的代码。每行多个语句是个坏主意

也不需要将
推到
@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

Perl类与其他语言中的类不同。你应该从阅读开始。如果你想要更多的细节,你应该阅读。不过,有些发行版试图对您隐藏细节;就像,还有其他的。你是对的,我不需要推(@INC,“.”)。那是我解决问题的盲目尝试的结果。感谢您的输入。感谢您帮助我理解范围问题。真正的sub有一堆数组和散列,一旦我开始“$self->”处理所有内容,它就变得一团糟。最终,我决定将sub作为单独的进程生成,并通过套接字传递数据。我感谢你的意见。