首页 文章

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

提问于
浏览
4

具体来说,我想使用带有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数组而不是piddles . 在显式列之后将返回未在要显示的显式列列表中指定的任何列 . (默认B) .

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

2 回答

  • 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

    我认为在这里使用 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是一个很好的资源 .

相关问题