Ich versuche, ein einfaches Perl-Skript zu schreiben, das eine * .csv-Datei liest, die Zeilen der * .csv-Datei in einem zweidimensionalen Array platziert und dann ein Element aus dem Array druckt und dann eine Zeile des Array.
%Vor%Wenn ich dieses Skript ausführe, erhalte ich den folgenden Fehler und nichts druckt:
String ("1") kann nicht als ARRAY ref verwendet werden, während "strict refs" in der ./scripts.pl Zeile 16 verwendet wird.
Ich habe in einer Reihe anderer Foren nachgeschaut und bin mir immer noch nicht sicher, wie ich dieses Problem beheben kann. Kann mir jemand helfen, dieses Skript zu reparieren?
Sie erstellen kein zweidimensionales Array (ein AoA oder "Array of Arrays" in Perl-Sprache). Diese Zeile:
%Vor% hängt die Daten in @row
an @table
an. Sie müssen stattdessen eine Referenz einfügen und jedes Mal eine neue Variable durch die Schleife erstellen, so dass Sie nicht wiederholt dieselbe Referenz drücken:
Die Verwendung von split
ist zwar für triviale CSV-Dateien in Ordnung, aber für andere Zwecke ist sie unzureichend. Verwenden Sie stattdessen ein Modul wie Text :: CSV_XS :
Wenn Sie push mit Listenargumenten aufrufen, fügen Sie die erste Liste mit den verbleibenden Listen stapelweise hinzu. Lesen Sie über Push bei Perldoc . Ihr Aufruf von push(@table, @row);
erstellt also eine längere @table
-Liste, kein zweidimensionales Array.
Sie haben mehrere Posts erhalten, die durch das Drücken einer Listenreferenz auf @row
als \@row
eine Liste von Zeilen erstellen, und das funktioniert auch. Ich tendiere dazu, es ein bisschen anders zu machen. Bei Perl gibt es natürlich immer einen anderen Weg!
Syntaktisch können Sie auch einen anonymen Array-Verweis in das Skalarelement einer Liste verschieben, um eine Liste mit mehreren Dimensionen zu erstellen. Das wichtigste, was man über Referenzen in Perl wissen sollte, ist: 1) sie sind ein Skalar und 2) sie können sich auf alles in Perl beziehen - Code, Array, Hash, eine andere Referenz. Verbringe etwas Zeit mit dem Perl Ref Tutorial und dies wird klarer werden. Fügen Sie mit Ihrem Code einfach [ ]
um das Element hinzu, das die 2. Dimension in Ihrer Liste sein soll.% Co_de% sollte also push(@table, @row);
sein. Im gleichen Sinne fügen Sie push(@table, [ @row ]);
um Ihre Aufteilung ein, so dass sie% wird. co_de% Dies führt gleichzeitig die Aufteilung durch und erstellt ein anonymes Array für das Ergebnis.
Das spezielle Problem, das Sie haben, wie man eine multidimensionale Liste erstellt und auf sie zugreift, wird auch in Tom Christensens Perllotutorial sehr gut behandelt Die Lösungen für Ihre spezifischen Probleme mit Ihrem Code werden hier direkt behandelt.
Umschreiben Sie Ihren Code mit dem genauen Code von Toms Beispiel in Perllol, es wird dies:
%Vor%