如何在带有pass-by-reference的子程序中使用PDL rcols?

时间:2010-10-05 22:09:26

标签: perl pass-by-reference pdl

具体来说,我想使用带有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

2 个答案:

答案 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