Wie eine Schleife über ein Array von Arrays als Referenz?
Den code unten funktioniert, wenn $a
ist ein Array von Arrays, aber ich brauche $a
zu werden eine Referenz auf das Array von Arrays.
Frage
Wie kann ich Durchlaufen $a
?
#!/usr/bin/perl
use warnings;
use strict;
use Data::Dumper;
my @AoA = ( ['aaa','hdr','500'],
['bbb','jid','424'],
['ccc','rde','402'],
);
my $a = \@AoA;
my $s = "bbb";
my $d = "ddd";
for my $i ( 0 .. $#a ) {
for my $j ( 0 .. $#{ $a[$i] } ) {
if ($a[$i][$j] eq $s) {
$a[$i][$j] = $d;
last;
}
}
}
print Dumper $a;
- gute Frage! Ich war eigentlich erstaunt über die gleiche Sache.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Auch, zu berechnen, die Anzahl der Elemente im array-Referenz (die, wie Sie sehen können aus dem obigen code müssen Sie nicht für Ihre spezifischen code), der einfachste Ansatz ist:
Auch, um auf die Daten innerhalb einer arrayref von arrayrefs, verwenden Sie einfach den dereference operator auf Sie:
Darüber hinaus können Sie Ihre arrayref von arrayrefs die Weise hast du (nehmen Sie eine Referenz auf array von arrays) oder sofort als Referenz:
Als seitliche Anmerkung, bitte verwenden Sie niemals
$a
und$b
als identifyer Namen - Sie haben Besondere Zwecke (verwendet im Art-Blöcke für Beispiel)$#$a
auch funktioniert und gibt das Letzte array-index, mit dem, was war in diesem Fall benötigt. Hässlich? Vielleicht, aberscalar(@$a)
ist nicht gerade intuitiv, entweder.for (0..$#array) {}
ist oft nützlich.Zu dereferenzieren in Perl, Sie haben eine Vielzahl von Optionen. Für den Anfang schlage ich vor, Sie Lesen perlref. Hier ist der relevante code-Teil mit minimalen änderungen, so dass Sie sehen können, was zu unterschiedlichen (aber, ich Stimme mit anderen Kommentaren, um Ihren code mehr Perlish).
Der einfachste Weg zu dereferenzieren, meiner Meinung nach, ist daran zu erinnern, dass arrays und hashes kann immer nur enthalten scalar Werte (siehe perldoc perldata). Was bedeutet, dass das array
...enthält nur drei scalar-Werte, die Referenzen auf andere arrays. Sie schreiben, könnte es wie folgt aus:
Mit diesem im Verstand, es ist einfach vorstellbar (wie DVK schlug in seiner Antwort) eine Schleife wie:
Wissen, dass
$aref
ist eine array-Referenz, die die Dereferenzierung ist einfach:Auch, da die Werte in einer for-Schleife mit alias, alle änderungen, Sie wirkt sich auf das original-array. Also, wenn die "Verarbeitung" in der Schleife oben enthält eine Zuordnung wie
Das bedeutet, dass die Werte in
@all
auch geändert, genau so, wie wenn du geschrieben hättest:Fand ich die Verwendung von "letzter" zu werden mehrdeutig, innere oder äußere, also machte ich es explizit.
Immer, wenn ich viel mit arrays von arrays oder hashes oder hashes oder arrays von hashes von arrays, beginne ich zu denken, in Begriffen der objektorientierten Programmierung. Perl-OOP ist nicht alles, was Komplex ist, und es versteckt sich eine Menge der logischen Komplexität.
Nun, in diesem sehr einfachen Beispiel, wäre es viel einfacher, nur um es zu schreiben ohne Objekt-Orientierung, und Sie haben bereits mehrere gute Antworten (vor allem vergaß zu dereferenzieren Referenzen).
Aber sobald Sie anfangen, merken Sie, dass Sie mehr komplexe Strukturen in Perl als einfach hashes, arrays und Skalare, Ihre Daten-Strukturen beginnen immer komplexer und schwieriger zu analysieren, ohne OOP.