不是Perl类中的代码引用

时间:2017-03-18 12:31:33

标签: perl oop

我很难过。我是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);

的行

2 个答案:

答案 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包含子例程引用,而不是哈希引用。

其他一些建议。

  1. 始终use strictuse warnings
  2. 间接对象表示法($new_excel = new Haha("sample path"))可能会在某些时候刻录你。请改用$new_excel = Haha->new("sample path")
  3. 您的第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};
}