2014-01-22 40 views
2

当我创建2个独立的Perl对象实例时,第二个对象将覆盖第一个对象的数据。我是OO Perl的新手,所以我认为我在处理类中的$ self变量时缺少一些基本的东西。为什么$ ptr2对象的数据覆盖$ ptr1对象的数据?它可能是Perl专家提供的一个简单的1分钟的答案,但我一直在为此感到痛苦。我的实际应用程序应该从不同来源获取大量数据并运行一些数据分析,因此下面是一个简化版本,用于显示手头的问题。新的perl对象覆盖先前对象的数据

我没有检查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 
+4

'use strict;使用警告;'会为你找到这些错误。 –

回答

6

在TestClass.pm与$self->{$key}(线16和24),和与%self%$self(线23)取代的$self{$key}所有实例。

输出将是这样的:

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将捕获这些类型的错误你。

+0

非常感谢!我知道我在做那样的傻事。我认为self是对散列的引用,而不是散列本身。 – ashar76

+0

另外我尝试'严格使用';'但是这并不表示这个问题。 – ashar76

+0

我得到这个:'全局符号'%self'需要在cl.pl第43行显式包名称。 执行cl.pl因编译错误而中止。' – codnodder