Черт побери, Perl не может благословить мой объект.

Помимо прочего, я пытаюсь реализовать метод 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...

Два вопроса:

  1. Что не так с тем, что я сделал?
  2. Не мог бы кто-нибудь прояснить perldiag объяснение этой ошибки времени компиляции?

13
задан Zaid 20 June 2013 в 11:57
поделиться