繁体   English   中英

新的perl对象将覆盖先前对象的数据

[英]New perl object overwrites data of previous object

当我创建2个单独的Perl对象实例时,第二个实例实例将覆盖第一个实例的数据。 我是OO Perl的新手,所以我认为我在类中处理$ self变量时缺少一些基本知识。 为什么$ ptr2对象的数据会覆盖$ ptr1对象的数据? 从Perl专家那里大概可以很轻松地回答1分钟,但是我对此一直不敢恭维。 我的实际应用程序应该从不同来源获取大量数据并进行一些数据分析,因此下面提供的是简化版本以说明当前的问题。

我确实在下面检查了与同一主题相关的另一个问题 ,但这似乎与我的问题不同。

以下是我班上的内容:

package TestClass;

sub new {
  my ($object, $file) = @_;
  my $class = ref($object) || $object;
  my $self = { myfile => $file, };
  bless($self, $class);
  return($self);
}
# grabs key-val pairs from file
sub getFileData {
  my($self) = @_;
  open (FILE, "$self->{myfile}" ) or die "Cannot open\n";
  while (my $curline = <FILE>) {
    my @fields = split(/\s+/,$curline);
    $self{$fields[0]} = $fields[1];
  }
  close FILE;
}
# prints key-val pairs to stdout
sub printFileData {
  my($self) = @_;
  foreach my $key (keys %self) {
    print "$key -> $self{$key}\n";
  }
}
1;

下面是我如何调用类对象:

use TestClass;

my $ptr1 = TestClass->new("test1.txt");
my $ptr2 = TestClass->new("test2.txt");

$ptr1->getFileData();
print "This is correct for test1.txt\n";
$ptr1->printFileData();

$ptr2->getFileData();

print "This is wrong for test1.txt, test2.txt overwrote test1.txt\n";
$ptr1->printFileData();
$ptr2->printFileData();

test1.txt和test2.txt分别具有单行“ VAL1 1”和“ VAL1 2”。

脚本的输出如下所示:

This is correct for test1.txt
VAL1 -> 1
This is wrong for test1.txt, test2.txt overwrote test1.txt
VAL1 -> 2
VAL1 -> 2

在TestClass.pm中,将$self{$key}所有实例替换为$self{$key} $self->{$key} (第16和24行),将%self替换为%$self (第23行)。

您的输出将如下所示:

This is correct for test1.txt
myfile => test1.txt
VAL1 => 1
This is wrong for test1.txt, test2.txt overwrote test1.txt
myfile => test1.txt
VAL1 => 1
myfile => test2.txt
VAL1 => 2

附带说明一下,如果您use strict; Perl会为您捕获这些错误。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM