试图在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命令,所以我可以在返回之前检查它。
访问者打印正确的值,但是当我打印返回的内容时,它是未定义的。我的语法搞砸了吗?我只是个白痴?
由于
答案 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);
}
}