4

具体来说,我想将 rcols 与 PERLCOLS 选项一起使用。

这是我想要做的:

my @array;
getColumn(\@array, $file, 4); # get the fourth column from file

如果我使用\@array,我可以这样做,但为了向后兼容,我不想这样做。这是我使用数组引用引用的方法:

sub getColumn {

    my ($arefref, $file, $colNum) = @_;    

    my @read = rcols $file, { PERLCOLS => [$colNum] };
    $$arefref = $read[-1];

    return;
}

但是,我不知道如何制作一个以数组 ref 作为参数的子例程,而无需说类似@$aref = @{$read[-1]}的内容,因为它会单独复制每个元素。

PS:阅读PDL::IO::Misc 文档,似乎 perl 数组应该是,$read[0]但事实并非如此。

PERLCOLS - 一个列号数组,将被读入 perl 数组而不是 piddles。任何未在要读取的显式列列表中指定的列都将在显式列之后返回。(默认 B)。

我正在使用 PDL v2.4.4_05 和为 x86_64-linux-thread-multi 构建的 Perl v5.10.0

4

2 回答 2

1

我相信在这里使用的部分困难rcols是用户正在运行 PDL-2.4.4,而rcols文档版本来自 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 邮件列表是一个很好的资源。

于 2012-04-20T22:31:31.817 回答
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]

于 2010-10-05T23:09:46.887 回答