Ich habe eine kleine Klasse geschrieben, die gerade einige Getter- und Setter-Methoden bekommen hat. Eine dieser Eigenschaften ist ein Hash.
sub getMyData
{
my $objekt = shift;
return $objekt->{MYDATA};
}
sub setMyData
{
my $objekt = shift;
my %myData= shift;
$objekt->{MYDATA} = %myData;
}
Wenn ich den Wert so in einem anderen Skript einstelle, das auf meine Klasse zugreift:
my %test;
$test{"apple"}="red";
$objekt = MYNAMESPACE::MYCLASS->new;
$objekt->setMyData(%test);
Ich dachte, ich kann diesen Wert einfach zugreifen über:
my $data = $objekt->getMyData;
print $data{"apple"};
Ich bekomme nur undef Wert.
Kann mir jemand sagen, was "hier falsch ist und wie ich auf getMyData zugreifen und den Wert" rot "drucken kann?
Antworten:
3 für die Antwort № 1Ihnen fehlt der Dereferenzierungspfeil. Weil Sie ein Hashref setzen (%myData
) in, bekommst du auch eine Referenz raus.
my $data = $objekt->getMyData;
print $data->{"apple"};
# ^
# here
Sie müssen auch die Zuordnung ändern, da Sie eine Liste an den Setter übergeben, keine Referenz. shift
ist für skalare (Einzel-) Werte, aber %test
wird in eine Liste umgewandelt (viele Werte).
sub setMyData
{
my $objekt = shift;
my %myData = @_;
$objekt->{MYDATA} = %myData;
}
Es gibt jedoch noch einige weitere Probleme mit Ihrem Code.
4 für die Antwort № 2
shift
entfernt und gibt das zurück zuerst Element eines Arrays. Innerhalb eines Unterprogramms wird eine Bare-Shift ausgeführt @_
, der eine Kopie aller an diese Unterroutine übergebenen Argumente enthält.
Was hier wirklich passiert, ist das setMyData
werden diese Daten übergeben:
setMyData($objekt, "apple", "red");
- Der Erste
shift
imsetMyData
entfernt$objekt
von@_
- Der Zweite
shift
imsetMyData
Entfernt "apple", aber da Sie das Ergebnis dieser Verschiebung einem Hash zuweisen, wird ein Hash erstellt, der wie folgt aussieht:"apple" => undef
- Sie nehmen einen Verweis auf diesen Hash und speichern ihn im MYDATA-Schlüssel von
$objekt
Was Sie wirklich wollen, ist, den Rest zuzuweisen @_
zu deinem Hash:
sub setMyData {
my $objekt = shift;
my %myData = @_;
# my ($objekt, %myData) = @_; (alternative)
$objekt->{MYDATA} = %myData;
}
Eine andere Möglichkeit besteht darin, stattdessen eine Hash-Referenz an zu senden setMyData
, welche würde arbeiten mit shift
:
sub setMyData {
my $objekt = shift;
my $myData_ref = shift
$objekt->{MYDATA} = $myData_ref;
}
$objekt->setMyData(%test);