Frage

Wortspiele beiseite, ich versuche, eine import-Methode in meiner Perl-Klasse zu implementieren, um ein Data-Objekt, das im Wesentlichen ein verherrlichtes Array von Hashrefs ist, aus einem richtigen Array von Hashrefs zu instanziieren.

Hier ist ein Beispiel, wie ich es verwenden möchte:

# 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


Meine import-Implementierung lautet wie folgt:

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;

Das Überraschende ist, dass Perl den Fehler zur Kompilierungszeit meldet (beachten Sie den BEGIN-Block):

Can't bless non-reference value at Data.pm line 51.
BEGIN failed--compilation aborted at myScript.pl line 8.

perldiag hat nicht viel Klarheit in das Geschehen gebracht:

Nichtreferenzwert kann nicht gesegnet werden

(F) Es dürfen nur harte Referenzen gesegnet werden. So "erzwingt" Perl Einkapselung von Objekten. Sehen perlobj .


Ich habe sogar versucht, das Objekt zu initialisieren und die Daten in zwei separaten Schritten hinzuzufügen:

sub import {                         #< Another constructor >

    my ( $class, $data ) = @_;

    my $obj = $class->initialize;
    push @$obj, @$data;

    return $obj;
}

Dies führte zu folgendem Fehler bei der Kompilierung:

Can't use an undefined value as an ARRAY reference...
BEGIN failed--compilation aborted at...


Zwei Fragen:

  1. Was ist los mit dem, was ich getan habe?
  2. Könnte jemand bitte die Erklärung des perldiag für diesen Fehler bei der Kompilierung klären?
War es hilfreich?

Lösung

import () ist ein gefährlicher Name für eine Methode, da Perl manchmal eine Methode namens 'import' für Sie aufruft.In der Tat die Aussage:

use Data;

bedeutet wirklich:

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

was während der 'Kompilierung' passiert.

Es ist also wahrscheinlich, dass Ihre import () -Methode von Perl als Teil des Klassenlademechanismus aufgerufen wird, bevor Sie die Möglichkeit erhalten, sie zu verwenden.Sie sollten Ihre import () -Methode in etwas anderes umbenennen (z. B. import_data), und es sollte Ihnen gut gehen.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top