加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

死了,Perl不能保佑我的对象

发布时间:2020-12-15 21:27:29 所属栏目:大数据 来源:网络整理
导读:Puns抛在一边,我试图在我的Perl类中实现一个导入方法来实例化一个数据对象,这个实例本质上是一个很好的散列数组,来自一个合适的hashref数组. 以下是我计划如何使用它的示例: # Pull in the datamy $data = Data-import( [ { a = 1,b = 7,c = 3},{ a = 7,b =
Puns抛在一边,我试图在我的Perl类中实现一个导入方法来实例化一个数据对象,这个实例本质上是一个很好的散列数组,来自一个合适的hashref数组.

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

# 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

我的进口实施如下:

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在编译时报告错误(注意BEGIN块):

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

perldiag对于发生了什么没有太清楚:

Can’t bless non-reference value

(F) Only hard references may be blessed. This is how Perl “enforces”
encapsulation of objects. See
07001.

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

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...

两个问题:

>我做了什么事情怎么了?
有人可以澄清这个编译时错误的perldiag解释吗?

解决方法

import()是给出方法的危险名称,因为Perl有时会为您调用一个名为“import”的方法.其实声明如下:
use Data;

真正意思:

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

这在“编译”期间发生.

因此,在您有机会使用它之前,可能您的import()方法被Perl调用,作为类加载机制的一部分.您应该将import()方法重命名为其他(例如import_data),您应该很好.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读