该死的,Perl不能祝福我的对象

时间:2011-09-11 09:49:27

标签: perl bless

除了Puns之外,我正在尝试在我的Perl类中实现一个import方法来实例化一个Data对象,它本质上是一个美化的hashrefs数组,来自一个正确的hashrefs数组。 / p>

以下是我计划如何使用它的示例:

# Pull in the data
my $data = Data->import(
                         [
                           { a => 1, b => 7, c => 3},
                           { a => 7, b => 9, c => 2},
                         ]
                       );

$data->manipulate;  # Use package methods

我的import实施如下:

package Data;

sub initialize {
    my $class = shift;
    my $data = [];
    bless $data, $class;
    return $data;
}

sub import {

    my ( $class, $data ) = @_;

    bless $data, $class;
    return $data;
}

1;

令人惊讶的是,Perl在编译 -time 报告错误(请注意BEGIN块):

Can't bless non-reference value at Data.pm line 51.
BEGIN failed--compilation aborted at myScript.pl line 8.

perldiag并没有更清楚地说明发生了什么:

  

无法祝福非参考价值

     

(F)只有硬参考才能得到祝福。这就是Perl“强制执行”的方式   封装对象。看到   perlobj


我甚至尝试初始化对象并在两个单独的步骤中添加数据:

sub import {                         #< Another constructor >

    my ( $class, $data ) = @_;

    my $obj = $class->initialize;
    push @$obj, @$data;

    return $obj;
}

这导致以下编译时错误:

Can't use an undefined value as an ARRAY reference...
BEGIN failed--compilation aborted at...

两个问题:

  1. 我做了什么错了?
  2. 有人可以澄清perldiag对此编译时错误的解释吗?

1 个答案:

答案 0 :(得分:21)

import()是一个给出方法的危险名称,因为Perl有时会为你调用一个名为'import'的方法。事实上,声明:

use Data;

真的意味着:

BEGIN {
    require Data;
    Data->import();
}

在'编译'期间发生。

因此,在您有机会使用它之前,Perl可能会将您的import()方法作为类加载机制的一部分进行调用。你应该将import()方法重命名为其他东西(例如import_data),你应该没问题。