Um eine skalare Referenz zu derefenzieren, stellen Sie dem Wert einfach das Skalar-Sigil voran, $
:
if (ref $data->{$_} eq 'SCALAR') {
push @values, ${$data->{$_}};
}
Ihr arrayref Fall ist nicht ganz richtig, da Sie auf das erste arrayref dereferenzieren Element anstatt alle Elemente des Arrays zu erhalten. Da Sie jedoch einen Skalar speichern, können Sie nicht alle Werte des Arrayrefs speichern, es sei denn, Sie haben sie auf irgendeine Weise in einen Skalar umgewandelt -- sagen wir, indem Sie die Anzahl der Elemente in diesem Arrayref erhalten (was Sie erhalten, wenn Sie ein Array im Skalarkontext auswerten), oder indem Sie alle Arrayelemente zu einem String verketten.
Siehe perldoc perlref :
Referenzen verwenden
-
Überall dort, wo Sie einen Bezeichner (oder eine Kette von Bezeichnern) als Teil eines Variablen- oder Unterprogrammnamens einsetzen würden, können Sie den Bezeichner durch eine einfache Skalarvariable ersetzen, die eine Referenz des richtigen Typs enthält:
$bar = $$scalarref;
push(@$arrayref, $filename);
$$arrayref[0] = "January";
$$hashref{"KEY"} = "VALUE";
&$coderef(1,2,3);
print $globref "output\n";
Es ist wichtig zu verstehen, dass wir hier ausdrücklich nicht $arrayref[0] oder $hashref{"KEY"} dereferenzieren. Die Dereferenzierung der Skalarvariablen erfolgt vor der Suche nach dem Schlüssel. Alles, was komplizierter ist als eine einfache skalare Variable, muss die Methoden 2 oder 3 [unten] verwenden. Eine "einfache Skalarvariable" enthält jedoch einen Bezeichner, der selbst rekursiv Methode 1 verwendet. Daher wird im Folgenden "howdy" ausgegeben.
$refrefref = \\\"howdy";
print $$$$refrefref;