Question

Mis à part les jeux de mots, j'essaie de mettre en œuvre un import Méthode dans ma classe Perl pour instancier un Data Objet, qui est essentiellement un tableau glorifié de hashrefs, à partir d'un bon tableau de hashrefs.

Voici un exemple de la façon dont je prévois de l'utiliser:

# 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

Mon import La mise en œuvre est la suivante:

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;

Ce qui est surprenant, c'est que Perl rapporte l'erreur à compiler-temps (noter la BEGIN bloquer):

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

perldiag N'a pas ajouté beaucoup de clarté à ce qui se passe:

Ne peut pas bénir la valeur non-référence

(F) Seules les références difficiles peuvent être bénies. C'est ainsi que Perl "applique" l'encapsulation des objets. Voir perlobj.


J'ai même essayé d'initialiser l'objet et d'ajouter les données en deux étapes distinctes:

sub import {                         #< Another constructor >

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

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

    return $obj;
}

Cela a entraîné l'erreur de compilation suivante:

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

Deux questions:

  1. Quel est le problème avec ce que j'ai fait?
  2. Quelqu'un pourrait-il clarifier le perldiag Explication de cette erreur de compilation-temps?
Était-ce utile?

La solution

Import () est un nom dangereux pour donner une méthode, car Perl appelle parfois une méthode appelée «import» pour vous. En fait, la déclaration:

use Data;

signifie vraiment:

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

ce qui se produit pendant la «compilation».

Il est donc probable que votre méthode import () soit appelée par Perl dans le cadre du mécanisme de chargement de classe avant d'avoir la chance de l'utiliser. Vous devez renommer votre méthode import () sur autre chose (par exemple import_data) et tout devrait aller bien.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top