/ / Zugriff auf Hash von object - perl, oop

Wie man auf den Hash von object - perl, oop zugreift

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.

Ausgabe vom Dumper: Bildbeschreibung hier eingeben

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 № 1

Ihnen 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");
  1. Der Erste shift im setMyData entfernt $objekt von @_
  2. Der Zweite shift im setMyData Entfernt "apple", aber da Sie das Ergebnis dieser Verschiebung einem Hash zuweisen, wird ein Hash erstellt, der wie folgt aussieht: "apple" => undef
  3. 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);