Помимо прочего, я пытаюсь реализовать метод import
в моем классе Perl для создания экземпляра объекта Data
, который по сути представляет собой прославленный массив хэш-ссылок. , из правильного массива хэш-ссылок.
Вот пример того, как я планирую его использовать:
# 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 сообщает об ошибке при компиляции -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
объяснение этой ошибки времени компиляции?