gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 08:36:03 24 4
gpt4 key购买 nike

当我创建 2 个单独的 Perl 对象实例时,第二个实例覆盖了第一个实例的数据。我是 OO Perl 的新手,所以我认为我在如何处理类中的 $self 变量方面缺少一些基本知识。为什么 $ptr2 对象的数据会覆盖 $ptr1 对象的数据?这可能是 Perl 专家的 1 分钟简单回答,但我一直在为此苦思冥想。我的实际应用程序应该从不同的来源获取一堆数据并运行一些数据分析,所以我下面的是一个简化版本来显示手头的问题。

我检查了one other question与下面的同一主题相关,但它似乎与我的问题不同。

下面是我在类里面的内容:

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}(第 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

附带说明一下,如果您使用 strict; Perl 会为您捕获这些类型的错误。

关于perl - 新的 perl 对象覆盖先前对象的数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21293946/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com