Perl - 未保存对象值

时间:2010-05-25 19:34:21

标签: perl

试图在Perl中使用OOP。我的问题是我在类中设置了一个变量,但是当我尝试检索它时,该值就丢失了。我确定这个问题很明显,但我需要一些额外的眼睛。

构造

sub new
{
    my ($class, $name) = @_;
    my $self = {
        _name => $name,
        _times => []
    };
    bless ($self, $class);
    return $self;
}

accessor / mutator方法:

sub times {
    my ($self) = shift;
    if (@_) { @{$self->{_times}} = shift }
    print "times size: " . @{$self->{_times}} . "\n";
    return @{$self->{_times}};
}

来自主程序的电话:

$js->addRun($duration, $curStartTime);
print "Times size: " . @{$js->times()} . "\n";

addRun()子例程中的相关代码:

sub addRun {
    my ($self, $duration, $runDateTime) = @_;
    if (!defined($duration) || !defined($runDateTime)) { return 0; }
    push(@{$self->{_times}},$duration);
}

当我运行此代码时,它进入addRun子例程并将值推送到_times变量。然后我通过调用accessor / mutator来打印该值。但是accessor / mutator有自己的print命令,所以我可以在返回之前检查它。

访问者打印正确的值,但是当我打印返回的内容时,它是未定义的。我的语法搞砸了吗?我只是个白痴?

由于

2 个答案:

答案 0 :(得分:9)

问题出在你的times()子程序中,你要返回一个数组,而不是数组引用。

然后在你的主程序中,你试图取消引用对times()的调用,但你不需要。

因此,在您的主程序中,只需按以下方式调用: -

print "Times size: " . $js->times() . "\n";

答案 1 :(得分:4)

我在启用了use strict;的情况下尝试了您的代码并获得了Can't use string ("1") as an ARRAY ref while "strict refs" in use

它指的是:print "Times size: " . @{$js->times()} . "\n";

times方法返回一个值数组。当您取消引用次数的返回值时,您将给它一个标量上下文。因此,对数组进行求值以给出数组中的成员数,即1.所以你试图访问不存在的@'1'。

这是代码的清理版本。你有几个错误(通过times方法设置时,不可能有一个长度为> 1的数组。

#!/usr/bin/perl 

use strict;
use warnings;

my $foo = Foo->new('Pogo');

$foo->addRun( 10, time );
$foo->addRun( 20, time );
print "Times: ", join( ' ', $foo->times ), "\n";
print "Times length: " . $foo->times . "\n";


BEGIN {
    package Foo;

    sub new {
        my ($class, $name) = @_;
        my $self = {
            _name => $name,
            _times => [],
        };
        bless $self, $class;
        return $self;
    }

    sub times {
        my $self = shift;
        if (@_) { 
            my $time_array = shift;
            @{$self->{_times}} = @{$time_array};
        }
        return @{$self->{_times}};
    }

    sub add_times {
        my $self = shift;
        return push @{$self->{_times}}, @_;
    }

    sub addRun {
        my ($self, $duration, $runDateTime) = @_;

        return 0 unless defined($duration) and defined($runDateTime);

        $self->add_times($duration);
    }

}