抛开双关语,我试图在我的 Perl 类中实现一个 import
方法来实例化一个 Data
对象,它本质上是一个荣耀的 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 在 compile -time 处报告错误(注意
BEGIN
块):Can't bless non-reference value at Data.pm line 51.
BEGIN failed--compilation aborted at myScript.pl line 8.
perldiag
并没有使发生的事情更加清晰:我什至尝试在两个单独的步骤中初始化对象并添加数据:
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/