Wenn Sie anrufen Push mit Liste Argumente, fügen Sie die erste Liste mit der verbleibenden Liste (n) in Stapel weise Art und Weise. 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 beim Drücken einer Listenreferenz auf @row
als \@row
eine Liste von Zeilen erstellen, und das funktioniert tatsächlich. 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 einfach [ ]
mit Ihrem Code um das Element hinzu, das die 2. Dimension in Ihrer Liste sein soll, also push(@table, @row);
sollte push(@table, [ @row ]);
sein. Im selben Sinne setzen Sie [ ]
um Ihren Split, so dass es push(@table, [ split(/\s*,\s*/, $_) ]);
wird Dies wird gleichzeitig die Aufteilung und erstellen ein anonymes Array zum Ergebnis.
Das spezielle Problem, das Sie haben, wie Sie eine multidimensionale Liste erstellen und aufrufen, wird auch in Tom Christensens perllol tutorial sehr gut behandelt. Die Lösungen für Ihre spezifischen Probleme mit Ihrem Code werden hier direkt behandelt.
Umschreiben von Code mit dem genauen Code von Tom Beispiel in perllol, wird es dies:
#!/usr/bin/perl
use strict;
use warnings;
my (@row, @table, $n, $rowref);
while(<DATA>) {
chomp;
# regex to separate CSV (use of a cpan module for CSV STRONGLY advised...
@row = /(?:^|,)("(?:[^"]+|"")*"|[^,]*)/g;
for (@row) {
if (s/^"//) { s/"$//; s/""/"/g; }
}
push(@table, [ @row ]); #Note the [ ] around the list
}
# Now the table is created, print it:
my $rowcnt=0;
foreach $rowref (@table) {
print "row $rowcnt:\n";
$rowcnt++;
print " [ @$rowref ], \n";
}
# You can access the table in the classic [i][j] form:
for my $i (0 .. $#table) {
$rowref = $table[$i];
$n = @$rowref - 1;
for my $j (0 .. $n) {
print "element $i, $j of table is $table[$i][$j]\n";
}
}
# You can format it:
for my $i (0 .. $#table) {
print "$table[$i][0] $table[$i][1]\n";
print "$table[$i][2]\n";
print "$table[$i][3], $table[$i][4] $table[$i][5]\n\n";
}
__DATA__
Mac,Doe,120 jefferson st.,Riverside, NJ, 08075
Jack,McGinnis,220 hobo Av.,Phila, PA,09119
"John ""Da Man""",Repici,120 Jefferson St.,Riverside, NJ,08075
Stephen,Tyler,"7452 Terrace ""At the Plaza"" road",SomeTown,SD, 91234
,Blankman,,SomeTown, SD, 00298
"Joan ""Joan, the bone""",Jett,"9th, at Terrace plc",Desert City,CO,0
+1 für nicht jedermanns Zeit zu verschwenden durch Weglassen 'use strict; Verwenden Sie Warnungen; '. – Ether
Sie sollten wirklich vermeiden 2 Argument 'offen'. Es gibt eine Reihe von Problemen, die am besten zu vermeiden sind (zur Diskussion siehe diesen perlmonks-Beitrag von 2001: http://www.perlmonks.org/?node_id=131085) Siehe diesen SO-Post für Informationen zu lexikalischen Handles: http: // stackoverflow .com/questions/613906/why-does-programming-perl-verwenden-lokal-nicht-meine-für-filehandles – daotoad
Siehe [perldoc perllol] (http://perldoc.perl.org/perllol.html#Access -und-Drucken) - Zugriff und Drucken – Zaid