Wie drucke ich ein Perl 2-dimensionales Array?

8

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?

    
Matt Pascoe 10.06.2010, 21:36
quelle

6 Antworten

10

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:

%Vor%

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 :

%Vor%     
Michael Carman 10.06.2010, 22:03
quelle
3
%Vor%

druckt

%Vor%

Edit: Ich werde andere dafür belohnen, dass sie den falschen Push bekommen haben.

    
Oesor 10.06.2010 21:39
quelle
2

Sie brauchen 2 Änderungen:

  1. Verwenden Sie die lokale Variable für die Zeile
  2. Verwenden Sie Referenzen für das Array, das Sie in @table eingefügt haben.

Also sollte Ihr Programm so aussehen:

%Vor%     
MBO 10.06.2010 21:47
quelle
2

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%     
dawg 11.06.2010 03:44
quelle
1

Vielleicht ist das was du willst:

%Vor%     
Curd 10.06.2010 21:48
quelle
0

Ändern

%Vor%

Dann druckt es ok.

    
LanceH 10.06.2010 21:52
quelle

Tags und Links