/ / Comment accéder au hash depuis un objet - perl, oop

Comment accéder à un hachage d'objet - perl, oop

J'ai écrit une petite classe qui vient de recevoir quelques méthodes de getter et de setter. Une de ces propriétés est un hachage.

sub getMyData
{
my $objekt = shift;
return $objekt->{MYDATA};
}

sub setMyData
{
my $objekt = shift;
my %myData= shift;

$objekt->{MYDATA} = %myData;
}

Si je fixe cette valeur dans un autre script qui permet d’accéder à ma classe:

my %test;
$test{"apple"}="red";

$objekt = MYNAMESPACE::MYCLASS->new;
$objekt->setMyData(%test);

Je pensais pouvoir accéder facilement à cette valeur via:

my $data = $objekt->getMyData;
print $data{"apple"};

Je viens d'avoir une valeur undef.

Sortie de Dumper: entrer la description de l'image ici

Quelqu'un peut-il me dire ce qui ne va pas ici et comment je peux accéder à getMyData et imprimer la valeur "rouge"?

Réponses:

3 pour la réponse № 1

Il vous manque la flèche de déréférence. Parce que vous avez mis un hashref (%myData), vous obtenez également une référence.

my $data = $objekt->getMyData;
print $data->{"apple"};
#          ^
#          here

Vous devez également modifier l'affectation, car vous transmettez une liste à l'utilisateur, et non une référence. shift est pour les valeurs scalaires (simples), mais %test se transforme en une liste (plusieurs valeurs).

sub setMyData
{
my $objekt = shift;
my %myData = @_;

$objekt->{MYDATA} = %myData;
}

Cependant, votre code pose encore quelques problèmes.


4 pour la réponse № 2

shift supprime et renvoie le premier élément d'un tableau. À l'intérieur d'un sous-programme, un changement nu fonctionne @_, qui contient une copie de tous les arguments passés à ce sous-programme.

Ce qui se passe vraiment ici est que setMyData est en train de transmettre ces données:

setMyData($objekt, "apple", "red");
  1. La première shift dans setMyData supprime $objekt de @_
  2. La deuxième shift dans setMyData supprime "apple", mais puisque vous assignez le résultat de ce décalage à un hachage, il crée un hachage ressemblant à ceci: "apple" => undef
  3. Vous prenez une référence à ce hachage et vous la stockez dans la clé MYDATA de $objekt

Ce que vous voulez vraiment, c'est assigner le reste de @_ à votre hachage:

sub setMyData {
my $objekt = shift;
my %myData = @_;
# my ($objekt, %myData) = @_; (alternative)

$objekt->{MYDATA} = %myData;
}

Une autre option consiste à envoyer une référence Hash à la place. setMyData, lequel aurait travailler avec shift:

sub setMyData {
my $objekt = shift;
my $myData_ref = shift

$objekt->{MYDATA} = $myData_ref;
}
$objekt->setMyData(%test);