我正在尝试编写一个简单的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)