gpt4 book ai didi

perl - 该死的,Perl 不能保佑我的对象

转载 作者:行者123 更新时间:2023-12-03 23:28:55 28 4
gpt4 key购买 nike

抛开双关语,我正在尝试实现 import我的 Perl 类中的方法来实例化 Data object,它本质上是一个经过美化的 hashrefs 数组,来自一个适当的 hashrefs 数组。

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

# 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 没有对正在发生的事情增加太多清晰度:

Can't bless non-reference value

(F) Only hard references may be blessed. This is how Perl "enforces" encapsulation of objects. See 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...

两个问题:
  • 我的所作所为有什么问题?
  • 有人可以澄清perldiag这个编译时错误的解释?
  • 最佳答案

    import() 是一个危险的方法名称,因为 Perl 有时会为您调用一个名为“import”的方法。事实上,声明如下:

    use Data;

    真正意思:
    BEGIN {
    require Data;
    Data->import();
    }

    这发生在“编译”期间。

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

    关于perl - 该死的,Perl 不能保佑我的对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7377424/

    28 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com