无法在Perl中使用Text::csv_XS从.csv中读取多列

无法在Perl中使用Text::csv_XS从.csv中读取多列,perl,csv,Perl,Csv,我正在尝试编写一个脚本,将.csv文件中的数据列分离到单独的列表中,供以后使用库时使用。获取单个列没有问题,但我似乎无法使用foreach循环遍历列列表 #!/usr/bin/perl use strict; use warnings; use Text::CSV_XS; use 5.18.2; my $csv = Text::CSV_XS->new ({ binary => 1, auto_diag => 1 }); open my $fh, "<", "/users

我正在尝试编写一个脚本,将.csv文件中的数据列分离到单独的列表中,供以后使用库时使用。获取单个列没有问题,但我似乎无法使用foreach循环遍历列列表

#!/usr/bin/perl
use strict;
use warnings;
use Text::CSV_XS;
use 5.18.2;

my $csv = Text::CSV_XS->new ({ binary => 1, auto_diag => 1 });
open my $fh, "<", "/users/whoever/test_csv.csv" or die "$!";

sub column_grabber {
        foreach my $column (@_) {
                my @data = map { $_->[$column] } @{$csv->getline_all ($fh)};
                return @data;
        }
}

my @column_numbers = (1,2,3,4);

my @collected_data = column_grabber(@column_numbers);

close $fh or die "$!";

感谢评论员的投入和帮助

请记住,
@data
(在此重命名为
@rows
$rows
)的每个元素都应该是对所选字段数组的引用

my @rows;
while ( my $row = $csv->getline($fh) ) {
   push @rows, [ @{ $row }[@column_numbers] ];
}


函数
在第一次迭代中从循环内部返回
s,因此它不会遍历除第一次迭代以外的列。另一方面,我建议养成习惯,总是将参数解包到函数中,除非你对速度有终极需求。(即便如此,如果归结到这一点,人们可能也应该重新审视一下设计。)因为调用方的输入在
@
中有别名,所以直接使用时很有可能出现严重的bug。另一个好习惯是通过引用传递列表(数组和散列)(除非它们仅仅是独立变量的短集合)。感谢您的帮助@zdim,我将继续记住这些指针。您的代码已经帮了我一点忙,我第一次使用引用。我遇到的唯一问题是从第一个代码示例中取消对@rows的引用。我遇到一个错误,告诉我不能使用字符串作为数组引用。我应该做些不同的事情从@rows获取数据吗?再说一次,这是我第一次和推荐人打交道,所以我可能错过了一些重要的事情。嗯?不可能取消对
@行的引用。这是一个数组,不是引用。(这是一个引用数组,引用是对数组的引用,数组中的元素数量与
@列\u编号
my @rows;
while ( my $row = $csv->getline($fh) ) {
   push @rows, [ @{ $row }[@column_numbers] ];
}
my $rows = $csv->getline_all($fh);
@_ = @{ $_ }[@column_numbers] for @$rows;
my @rows = map { [ @{ $_ }[@column_numbers] ] } @{ $csv->getline_all($fh) };