Perl - 未保存对象值

bry*_*esk 1 perl

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

构造函数:

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

accessor/mutator方法:

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

来自主程序的电话:

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

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

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

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

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

谢谢

dal*_*ton 9

问题在于你的times()子例程正在返回一个数组,而不是一个数组引用.

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

所以在你的主程序中只需按如下方式调用: -

print "Times size: " . $js->times() . "\n";
Run Code Online (Sandbox Code Playgroud)

  • +1.你应该回来一个阵列吗?您可能希望阅读wantarray以使您的代码更具上下文感知能力. (2认同)