不能使用字符串(“Managers :: Toke :: Interface”)作为HASH引用,而第47行使用“strict refs”

时间:2013-10-09 20:55:47

标签: perl perl-data-structures

我正在构建我的第一个Perl构造函数,我收到了这个错误。

Can't use string ("Managers::Toke::Interface") as a HASH ref while "strict refs" in use at

这是我的构造函数。

package Managers::Toke::Interface;
use strict;
use warnings;

use Core::ReturnValue;
use Data::Dumper;

## Toke stands for "The Online Kilobyte Extractor"



sub new {

my( $class, $username, $useruuid, $bytesSent, $bytesReceived, $bytePosition ) = @_ ;

my $self = {
'username'=> $username,
'useruuid'=> $useruuid,
'bytesSent'=> $bytesSent,
'bytesReceived' => $bytesReceived,
'bytePosition' => $bytePosition,
'date'         => $date,
};

return bless $self, $class;
}


sub explain {
    my $self = shift;
    return sprintf "Hi, I'm %s", $self->{'username'};
}

以下是调用它的程序:

my $return = Managers::Toke::Interface->new($username,
                                   $uuid,
                                   $receivedBytesToKB,
                                   $sentBytesToKB,
                                   $bytePosition) or die "$!";



$return = Managers::Toke::Interface->explain();

我希望答案不明显,提前谢谢。

1 个答案:

答案 0 :(得分:2)

我认为你误解了有关OOP如何运作的一些基本概念。

构造函数构造一个对象,然后返回它。您在构造函数中设置的所有时间属性都存储在对象中。 (您正在创建的类的实例。)但是您丢弃了您创建的对象并尝试在类本身上调用实例方法。

当您使用箭头(->)运算符调用方法时,左侧的东西( invocant )将作为第一个参数传递给方法。这就是为什么你可以在构造函数中将它解压缩到$class

当你说

Managers::Toke::Interface->explain();

这基本上等同于

Managers::Toke::Interface::explain( 'Managers::Toke::Interface' );

您将该字符串解压缩到$self子中的explain,然后尝试访问它,就像它是哈希引用一样。显然这不会起作用。当你调用一个实例方法时,你必须在对象实例上调用它,这通常是一个被祝福的hashref,而不是类。

my $object = Managers::Toke::Interface->new($username,
                               $uuid,
                               $receivedBytesToKB,
                               $sentBytesToKB,
                               $bytePosition) or die "$!";

$object->explain();

现在代码相当于

Managers::Toke::Interface::explain( $object );

其中$object是您在new中构建的内容,可以用作hashref,因为它是一个。

查看详细的Perl OO Tutorial了解更多信息,然后阅读Modern Perl中有关对象的章节。