Подтвердить что ты не робот

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

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

Ответ 1

import() - опасное имя для предоставления метода, поскольку Perl иногда вызывает метод, называемый "import" для вас. Фактически утверждение:

use Data;

действительно означает:

BEGIN {
    require Data;
    Data->import();
}

который происходит во время компиляции.

Поэтому, вероятно, ваш метод import() вызывается Perl как часть механизма загрузки класса, прежде чем вы сможете его использовать. Вы должны переименовать свой метод import() на что-то еще (например, import_data), и вы должны быть в порядке.