2 Stimmen

Dereferenzierung eines skalaren Verweises in einem hashref

Ich habe einen hashref mit arrayrefs und scalarrefs als Werte. Ich kann auf die Werte von arrayrefs zugreifen, aber nicht auf die scalarrefs.

foreach (keys %$data) {
  if (ref $data->{$_} eq 'ARRAY') { 
    push @values, $data->{$_}[0];
  }
  elsif (ref $data->{$_} eq 'SCALAR') { 
    push @values, $data->???
  }
}

Wie kann ich das tun?

7voto

Ether Punkte 51044

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

  1. Ü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;

1voto

Sean Punkte 28106

Wenn Sie sich nur mit den Werten von %$data können Sie anstelle der Tasten eine Schleife über sie legen:

for my $value (values %$data) {
    if (ref $value eq 'ARRAY') {
        push @values, $value->[0];
    } elsif (ref $value eq 'SCALAR') {
        push @values, $$value;
    }
}

Kurzer und lesbarer, IMHO.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X