Nếu bạn gọi push với các đối số danh sách, bạn thêm danh sách đầu tiên với danh sách còn lại (s) trong ngăn xếp thời trang khôn ngoan. Đọc về đẩy tại Perldoc. Vì vậy, cuộc gọi của bạn là push(@table, @row);
đang tạo danh sách dài hơn @table
, không phải là mảng hai chiều.
Bạn đã nhận được một số bài đăng đẩy danh sách tham chiếu đến @row
dưới dạng \@row
sẽ tạo danh sách các hàng và thực sự hoạt động. Tôi có xu hướng làm điều đó một chút khác biệt.Tất nhiên, với Perl, luôn luôn có một cách khác để làm điều đó!
Cú pháp, bạn cũng có thể đẩy tham chiếu mảng ẩn danh vào phần tử vô hướng của danh sách để tạo danh sách nhiều thứ nguyên. Điều quan trọng nhất cần biết về các tham chiếu trong Perl là: 1) chúng là một vô hướng và 2) chúng có thể tham chiếu đến bất kỳ thứ gì trong Perl - mã, mảng, băm, một tham chiếu khác. Hãy dành một chút thời gian với Perl Ref Tutorial và điều này sẽ trở nên rõ ràng hơn. Với mã của bạn, chỉ cần thêm [ ]
quanh phần tử bạn muốn là thứ nguyên thứ 2 trong danh sách của bạn, do đó, push(@table, @row);
phải là push(@table, [ @row ]);
Theo cùng một nghĩa, bạn đặt [ ]
xung quanh phần tách của mình để nó trở thành push(@table, [ split(/\s*,\s*/, $_) ]);
. một mảng ẩn danh cho kết quả.
Vấn đề cụ thể mà bạn có, cách tạo và truy cập danh sách đa chiều, cũng được xử lý rất tốt trong các giải pháp cụ thể với mã của bạn được giải quyết trực tiếp tại đây của Tom Christensen perllol tutorial.
Viết lại mã của bạn với các mã chính xác từ ví dụ của Tom trong perllol, nó trở nên này:
#!/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 cho không lãng phí thời gian của mọi người bằng cách bỏ qua 'use strict; sử dụng cảnh báo; – Ether
Bạn thực sự nên tránh 2 đối số 'mở'. Nó có một số vấn đề tốt nhất để tránh (để thảo luận xem bài đăng perlmonks 2001 này: http://www.perlmonks.org/?node_id=131085) Xem bài đăng SO này để biết thông tin về xử lý từ vựng: http: // stackoverflow .com/questions/613906/why-does-programming-perl-use-local-not-my-for-filehandles – daotoad
Xem ['perldoc perllol'] (http://perldoc.perl.org/perllol.html#Access -and-In ấn) - Truy cập và in – Zaid