具体来说,我想使用带有PERLCOLS选项的rcols。
这就是我想要做的事情:
my @array;
getColumn(\@array, $file, 4); # get the fourth column from file
如果我使用\@array
,我可以这样做,但为了向后兼容,我宁愿不这样做。以下是我使用array-ref-ref执行此操作的方法:
sub getColumn {
my ($arefref, $file, $colNum) = @_;
my @read = rcols $file, { PERLCOLS => [$colNum] };
$$arefref = $read[-1];
return;
}
但是,我没有看到如何创建一个子程序,它将数组引用作为参数,而不是说@$aref = @{$read[-1]}
之类的东西,它会单独复制每个元素。
PS:阅读PDL::IO::Misc
documentation,似乎perl数组应该是$read[0]
,但事实并非如此。
PERLCOLS - 要读入perl数组的列号数组 而不是小提琴。未在显式列表中指定的任何列 将在显式列之后返回要读取的列。 (默认B)。
我正在使用PDL v2.4.4_05和为x86_64-linux-thread-multi构建的Perl v5.10.0
答案 0 :(得分:1)
我不明白为什么这不起作用:
my $arr_ref;
getColumn( $arr_ref, $file, 4 );
sub getColumn {
my ( $arr_ref, $file, $colNum ) = @_;
my @read = rcols, $file, { PERLCOLS => [ $colNum ] };
# At this point, @read is a list of PDLs and array references.
$arr_ref = $read[-1];
}
查看rcols()
文档,看起来如果添加PERLCOLS
选项,它会返回您作为数组引用请求的任何列,因此您应该能够将它分配给数组引用你过去了。
至于文档问题,我从中理解的是你没有指定任何显式列,因此rcols()
将首先返回文件中的所有列作为PDL,然后返回列你请求为Perl arrayrefs,这就是您的arrayref在$read[-1]
中出现的原因。
答案 1 :(得分:1)
我认为在这里使用rcols
的部分困难在于用户正在运行PDL-2.4.4,而rcols
docs版本来自PDL-2.4.7,可能存在版本偏差功能。使用当前的PDL-2.4.10版本,可以很容易地使用rcols
读取单个数据列中的perl数组,该数组通过arrayref返回:
pdl> # cat data
1 2 3 4
1 2 3 4
1 2 3 4
pdl> $col = rcols 'data', 2, { perlcols=>[2] }
ARRAY(0x2916e60)
pdl> @{$col}
3 3 3
请注意,在当前版本中,perlcols
选项允许指定列的输出类型,而不是仅在末尾添加perl样式的列。
在PDL shell中使用pdldoc rcols
或执行help rcols
以查看更多文档。
一个很好的资源是perldl mailing list。