perl(Statistics :: PCA):不能使用字符串("0")作为ARRAY引用,而"strict refs"

Abd*_*del 3 perl strict ref

我正在尝试使用Statistics :: PCA包对某些遗传变异进行PCA.该软件包需要读入列表列表(如果我理解正确,可以是一个数组数组,对吧?).

下面是我的代码的一部分,我为每个人创建数组(每个人都是一个真正的人类主体,获得一个填充0和1的数组,代表是否存在称为"SV"的遗传变体),然后将它们推送到名为@LoL_SVs的数组数组中:

my @LoL_SVs;

foreach (@individuals) {
    my $ind = $_;
    foreach (@all_SVs) {
        if ($SV{$ind}{$_} != 1) {
            push(@{$SVs{$ind}}, "0");
        }
        if ($SV{$ind}{$_} == 1) {
            push(@{$SVs{$ind}}, "1");
        }
    }
    push @LoL_SVs, [ @{$SVs{$ind}} ];
} 
Run Code Online (Sandbox Code Playgroud)

然后我尝试加载模块的CPAN网站上描述的数据(参见*load_data*段落):

use Statistics::PCA;

my $pca = Statistics::PCA->new;

$pca->load_data ( { format => 'table', data => @LoL_SVs, } ); 
# ^ this line is where it goes wrong
Run Code Online (Sandbox Code Playgroud)

不幸的是,这不起作用,我收到错误消息:

在/home/abdel/myperl/share/perl/5.10.1/Statistics/PCA.pm第189行使用"严格引用"时,不能使用字符串("0")作为ARRAY引用.

知道这里可能出现什么问题吗?

我希望问题得到明确规定,否则如果您需要更多信息,请告诉我!非常感谢!

TLP*_*TLP 5

您在load_data通话中的选项包括:

data => @LoL_SVs
Run Code Online (Sandbox Code Playgroud)

而在文档中,它是这样描述的

data => [ \@Obs1, \@Obs2, \@Obs3, \@Obs4, \@Obs5 ], 
Run Code Online (Sandbox Code Playgroud)

您尝试加载数组,但模块需要数组引用(可能是数组引用).因此,当您尝试将空数组作为标量参数传递时,它将计算为0(因为它包含0个元素).相近:

my @bar;
my $foo = @bar;   # @bar is empty, $foo is 0
print $foo->[0];  # Can't use string ("0") as ARRAY ref ...
Run Code Online (Sandbox Code Playgroud)

可以通过将引用传递给@LoL_SVs:

data => \@LoL_SVs
Run Code Online (Sandbox Code Playgroud)

作为旁注,你正在使用它是好的

use strict;
Run Code Online (Sandbox Code Playgroud)

我也希望你能使用

use warnings;
Run Code Online (Sandbox Code Playgroud)

如果没有strict和使用变量名称@LoL_SVs就很容易进行拼写错误,@Lol_Svs这会导致难以发现错误.没有使用warnings,这样的错误将更难找到.