如何打印Perl二维数组?

Mat*_*coe 8 arrays perl

我正在尝试编写一个简单的Perl脚本,它读取*.csv,将*.csv文件的行放在二维数组中,然后打印出数组中的项目,然后打印一行数组.

#!/usr/bin/perl
use strict;
use warnings;

open(CSV, $ARGV[0]) || die("Cannot open the $ARGV[0] file: $!");
my @row;
my @table;

while(<CSV>) {
        @row = split(/\s*,\s*/, $_);
        push(@table, @row);
}
close CSV || die $!;

foreach my $element ( @{ $table[0] } ) {
    print $element, "\n";
}

print "$table[0][1]\n";
Run Code Online (Sandbox Code Playgroud)

当我运行此脚本时,我收到以下错误,没有打印:

在./scripts.pl第16行使用"strict refs"时,不能使用字符串("1")作为ARRAY引用.

我已经查看过其他一些论坛,但我仍然不确定如何解决这个问题.任何人都可以帮我修复这个脚本吗?

Mic*_*man 10

您不是在Perl-parlance中创建二维数组(AoA或"数组数组").这一行:

push(@table, @row);
Run Code Online (Sandbox Code Playgroud)

将数据附加@row@table.您需要改为引用一个引用,并在每次循环时创建一个新变量,这样就不会重复推送相同的引用:

my @table;
while(<CSV>) {
    my @row = split(/\s*,\s*/, $_);
    push(@table, \@row);
}
Run Code Online (Sandbox Code Playgroud)

虽然使用split对于简单的CSV文件是可以的,但它对其他任何东西都是不合适的.使用像Text :: CSV_XS这样的模块:

use strict;
use warnings;
use Text::CSV_XS;

my $csv  = Text::CSV_XS->new() or die "Can't create CSV parser.\n";
my $file = shift @ARGV         or die "No input file.\n";
open my $fh, '<', $file        or die "Can't read file '$file' [$!]\n";

my @table;
while (my $row = $csv->getline($fh)) {
    push @table, $row;
}
close $fh;

foreach my $row (@table) {
    foreach my $element (@$row) {
        print $element, "\n";
    }
}

print $table[0][1], "\n";
Run Code Online (Sandbox Code Playgroud)

  • +1使用Text :: CSV; 不是很傻. (3认同)