我很难过。我是Perl的新手,在阅读了一些文章之后,我仍然无法解决这个问题。这是一个非常小的课程。
package Haha;
sub new {
$class = shift;
$self = {
path => shift
};
bless $self, $class;
return $self;
}
sub setPath {
my ($self, $new_path) = shift;
$self->(path) = $new_path if defined $new_path;
return $self->(path);
}
sub getPath {
my $self = shift;
return $self->(path);
}
1;
我这样使用它:
use lib 'lib';
use Haha;
my $new_excel = new Haha("sample path");
print $new_excel->getPath() ;
<>;
Class Haha第23行提出了&#34;不是代码参考&#34;错误。
标有return $self->(path);
答案 0 :(得分:9)
您的类(与大多数Perl类一样)是在哈希上实现的。在构造函数中创建新对象时,可以这样做:
sub new {
$class = shift;
$self = {
path => shift
};
bless $self, $class;
return $self;
}
行$self = { ... }
创建一个匿名哈希,并在$self
中存储对该哈希的引用。因此,$self
是哈希引用。这意味着您应该使用哈希语法访问其内容。所以你的访问器和mutator方法都是错误的。
sub setPath {
my ($self, $new_path) = shift;
$self->(path) = $new_path if defined $new_path;
return $self->(path);
}
您使用括号而不是大括号来访问哈希中的path
值。这一行:
$self->(path) = $new_path if defined $new_path;
应该是:
# Note: braces, not parentheses
$self->{path} = $new_path if defined $new_path;
这一行:
return $self->(path);
应该是:
# Note: braces, not parentheses
return $self->{path};
您需要对getPath()
进行类似的修复。
不幸的是,语法$reference->($value)
完全有效。这意味着“调用您在$reference
中引用的子例程,并将其传递给$value
”。但是,当然,这需要$reference
包含子例程引用,而不是哈希引用。
其他一些建议。
use strict
和use warnings
。$new_excel = new Haha("sample path")
)可能会在某些时候刻录你。请改用$new_excel = Haha->new("sample path")
。my ($self, $new_path) = shift
行不符合您的想法。你想要my ($self, $new_path) = @_
。答案 1 :(得分:0)
path
是对象的属性,使用大括号:
sub getPath {
my $self = shift;
return $self->{path};
}
在子setPath
中,永远不会分配变量$new_path
,而是使用:
sub setPath {
my ($self, $new_path) = @_;
$self->{path} = $new_path if defined $new_path;
return $self->{path};
}