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

 我就是在刷粪_944 发布于 2023-02-01 00:40

当我创建2个单独的Perl对象实例时,第二个实例将覆盖第一个实例的数据.我是OO Perl的新手,所以我觉得我在如何处理类中的$ self变量时缺少基本的东西.为什么$ ptr2对象的数据会覆盖$ ptr1对象的数据?它可能只是Perl专家的一分钟答案,但我一直在为此而努力.我的实际应用程序应该从不同来源获取大量数据并运行一些数据分析,因此我在下面的内容是一个简化版本来显示手头的问题.

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

以下是我在课堂上的内容:

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 = ) {
    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

codnodder.. 6

在TestClass.pm替换的所有实例$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会为您捕获这些类型的错误.

撰写答案
今天,你开发时遇到什么问题呢?
立即提问
热门标签
PHP1.CN | 中国最专业的PHP中文社区 | PNG素材下载 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有