2017-03-18 43 views
-1

我很难过。我是Perl的新手,在阅读了一些文章后,我仍然无法弄清楚这一点。这是一个非常小的班级。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() ; 

<>; 

类哈哈线23发出 “没有一个代码参考” 错误。 ,说return $self->(path);

+7

请加'use strict;对你的文件使用warnings'并用'my'定义词法变量。当访问对象散列字段时,也使用大括号而不是括号:'$ self - > {path} = $ new_path' –

+3

'$ self - >(path)'暗示$ self是代码引用; '$ self - > {path}'=>散列引用; '$ self-> path' =>调用'path()'方法的祝福对象。请检查https://perldoc.perl.org/perlref.html#Making-References –

回答

9

你的类(像大多数Perl类)是在散列之上实现的。当您在构造函数中创建一个新的对象,你做这样的:

sub new { 
    $class = shift; 

    $self = { 
     path => shift 
    }; 

    bless $self, $class; 

    return $self; 
} 

线$self = { ... }创建一个匿名的哈希值,并存储在$self散列的引用。所以,$self是一个哈希引用。这意味着你应该使用哈希语法来访问它的内容。所以你的访问器和增变器方法是错误的。

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) = @_
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}; 
} 
+0

迂回地说,并不是'path'是一个属性,这意味着您需要使用大括号来访问它。这是类被实现为散列引用的事实。很可能(不可否认),实现一个类作为不同类型的引用 - 在这种情况下,将使用不同类型的括号。 –

相关问题