Отбросить в сторону, я пытаюсь реализовать метод import
в моем классе Perl для создания объекта 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
этой ошибки времени компиляции?