Wie kann ich eine Referenz Perl-hash in ein array in einen hash?
Dies ist der code-snippet, mit der ich arbeite:
my %photo_details = (
'black_cat' => (
('size' => '1600x1200', 'position' => -25),
('size' => '1280x1024', 'position' => 25),
('size' => '800x600', 'position' => 0),
),
'race_car' => (
('size' => '1600x1200', 'position' => 10),
('size' => '800x600', 'position' => 5),
),
);
my $photo = 'black_cat';
foreach my $photo_detail ($photo_details{$photo})
{
my $size = $photo_detail{'size'};
my $position = $photo_detail{'position'};
print ("size = $size, position = $position\n");
}
Was ich erwarte zu bekommen, ist:
grösse = 1600x1200, position = -25
size = 1280x1024, position = 25
size = 800x600, position = 0
Was ich bekomme ist:
Verwendung von nicht initialisierten Wert $Größe in concatenation (.) oder string an C:\Test.pl Zeile 23.
Verwendung von nicht initialisierten Wert von $position in concatenation (.) oder string an C:\Test.pl Zeile 23.
size = , position =
Die foreach-Anweisung ist eindeutig falsch, wie nicht nur gibt es keine Werte für $Größe und die $position, es hat nur vorbei durch die Schleife einmal statt dreimal. Ich habe versucht, alle möglichen Varianten der variable Präfixe und keine gefunden, die funktionieren.
Was mache ich falsch?
InformationsquelleAutor TallGuy | 2010-01-03
Du musst angemeldet sein, um einen Kommentar abzugeben.
Hier einige aktualisierte code, mit einer Erklärung unten:
Habe ich ersetzt einige Ihrer Runden Klammern mit eckigen und geschweiften Klammern. In Perl eckigen Klammern geben Sie eine Referenz auf einen anonymen array, und die geschweiften Klammern bezeichnen eine Referenz auf eine anonyme hash. Diese werden als anonym, weil es keine explizite variable name für die anonymen array oder hash.
Als Perl-Datenstrukturen vornehmen, speichern Sie eine Referenz auf einen hash statt der eigentlichen hash, müssen Sie diese zum erstellen der Referenzen. Sie können dies in zwei Schritten so:
Daten aus $array_ref und $hash_ref, müssen Sie die -> Betreiber:
Brauchen Sie nicht die Anführungszeichen innerhalb von {} beim verweisen auf einen hash-Schlüssel, obwohl einige Leute denken, Zitate über einen hash-Schlüssel, um gute Praxis.
Ich fügte hinzu, ein Beispiel für die iteration über die gesamte Datenstruktur als ein Beispiel, anstatt einfach nur Lust auf eine Referenz. Hier ist die erste Zeile:
Die Schlüssel-Methode gibt alle Schlüssel in einem hash, so dass Sie bekommen können, um die. Die nächste Zeile iteriert über alle photo_detail hashrefs in %photo_details:
Den
@{ $photo_details{$photo} }
de-Referenzierung der Referenz$photo_details{$photo}
in ein array Durchlaufen mit foreach.Die Letzte Sache, die ich Hinzugefügt ein Aufruf an Data::Dumper, ein sehr nützliches Modul verteilt mit Perl druckt Datenstrukturen für Sie. Dies ist sehr nützlich beim Aufbau der Datenstrukturen, wie Sie ist eng verwandt cousin Data::Dumper::Simple. Dieses Modul ist leider nicht zusammen mit Perl, aber ich bevorzuge seinen Ausgang, wie es Variablennamen enthält.
Für einige weitere Lesen über, wie man komplexe Datenstrukturen mit Referenzen, check-out perlreftut.
$photo_details{$name}
?Ja, danke für den Fang. Es ist nun behoben.
my $hash_ref = \%hash_ref;
- das sollte\%hash
InformationsquelleAutor James Thompson
Immer an der ersten Stelle beginnen jedes Skript oder-Modul mit:
Erhalten Sie weitere Warnmeldungen und früher, das hilft enorm bei der Fehlersuche.
Kann ich nicht duplizieren Fehler: wenn ich den code in eine Datei und führen Sie es ohne zusätzliche flags, die ich bekomme:
size = , position =
.Es gibt keinedie Fehlermeldung nicht übereinstimmen.$size
variable in den code, den Sie gedruckt, alsoDennoch, erklären Sie sich mit der Daten-Strukturen falsch. Hashes und arrays können
nur Skalare Werte enthalten, keine Listen: wenn Sie so wollen, zu brüten, ein array oder
ein hash ist, müssen Sie, um es ein Verweis. Sehen perldoc perldata, perldoc perldsc
und perldoc perlreftut für mehr über Datenstrukturen und Referenzen.
Ich bin verwirrt, $size definitiv ist in das snippet, das er geschrieben, Sie selbst trug es über dem code. Was meinst du?
ja, du hast Recht; ich dachte der Fehler stammen könnten mit
$photo_detail->{$size}
vs$photo_detail->{size}
. Ich habe Total übersehen dasmy $size = ...
Erklärung. Trotzdem kann ich nicht duplizieren Sie die OP ' s Fehler. Mit Strikturen aktiviert, wird der code barfs früher, an%photo_detail
nicht erklärt wird (durch die for-Schleife nicht die array-Dereferenzierung).Danke für die Erklärung. Die Datenstruktur sieht definitiv jetzt. Allerdings, wenn ich versuche den code oben bekomme ich "Globalen symbol "%photo_detail" requires explicit package name" in Zeile 20 und 21. Ich lese die docs (vielen Dank dafür) und verändert die foreach-Anweisung, um
[foreach my $photo_detail (@{%photo_details->{black_cat}})], changed
[$photo_detail{Größe}][$photo_detail->{size}] and changed
[$photo_detail{position}], `[$photo_detail->{position}] und es funktioniert, aber ich bekomme einen "Über einen hash als Referenz wird als veraltet" auf der foreach-Zeile. Irgendwelche Ideen?Ich war nicht der Fehler deiner Logik, nur die Aussage über $size warf mich an! Die OP scheint das lernen über die Verwendung von Siegeln und Bereiche .. beide sind zunächst verwirrend. (+1 von mir für deine gute Beratung)
InformationsquelleAutor Ether
Es ist wirklich nur eine Sache, die Sie haben zu kümmern, und das ist die oberste Ebene der Datenstruktur. Danach verwenden Sie einfach die richtige Indizierung syntax für jede Ebene:
Werden, wenn ein normaler hash, der Sie auf die Taste, die Sie wollen, dann richten Sie die zusätzlichen Indizes für jede Ebene nach es:
Wenn Sie einen Verweis haben, Sie tun fast das gleiche, aber Sie haben zu beginnen mit der ersten Dereferenzierung mit einem Pfeil
->
nach der top-level-Referenz. Nach, dass es das gleiche Indizierung Reihenfolge:Für alle details finden Sie unter Intermediate Perl, wo wir erklären, Referenz-syntax.
InformationsquelleAutor brian d foy