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.
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 № 1Il 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");
- La première
shift
danssetMyData
supprime$objekt
de@_
- La deuxième
shift
danssetMyData
supprime "apple", mais puisque vous assignez le résultat de ce décalage à un hachage, il crée un hachage ressemblant à ceci:"apple" => undef
- 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);