【发布时间】:2011-11-14 16:47:50
【问题描述】:
除了双关语,我试图在我的 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 在编译-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...
两个问题:
- 我所做的有什么问题?
- 有人可以澄清
perldiag对此编译时错误的解释吗?
【问题讨论】:
-
后见之明:有没有比
perldiag更好的参考来理解警告/错误消息? -
一般来说,您可以通过插入先决条件的打印来解决此类错误。在这种情况下,您的子例程的参数。 (
print "import got: @_\n";) 这会让你知道你认为的数组实际上不是。接下来,添加一个警卫,例如ref $data eq 'ARRAY' or confess "not an array: '$data'";,您会发现有问题的电话来自哪里。 (confess来自use Carp 'confess';并提供完整的回溯)保留该行,因为它可以帮助您在将来立即发现其他错误,可能会将confess更改为croak。 -
@Lance Roberts :最初的标题是对
Acme::Damn模块(与bless的作用相反)的文字游戏