从perl中的数组数组中取消引用数组

时间:2016-05-15 16:17:49

标签: arrays perl

我有各种子程序给我数组数组。我已经单独测试了它们,不知何故,当我编写我的主程序时,我无法使程序识别我的数组。我知道这是一个解除引用的问题,或者至少我怀疑它很重要。

代码有点长,但我会尝试解释它:

my @leaderboard=@arrarraa; #an array of arrays
my $parentmass=$spect[$#spect]; #scalar

while (scalar @leaderboard>0) {
        for my $i(0..(scalar @leaderboard-1)) {
        my $curref=$leaderboard[$i]; #the program says here that there is an uninitialized value. But I start with a list of 18 elements.
        my @currentarray=@$curref; #then i try to dereference the array
        my $w=sumaarray (@currentarray);
        if ($w==$parentmass) {
            if (defined $Leader[0]) {
                my $sc1=score (@currentarray);
                my $sc2=score (@Leader);
                if ($sc1>$sc2) {
                    @Leader=@currentarray;
                }

            }
            else {@Leader=@currentarray;}
        }
        elsif ($w>$parentmass) {splice @leaderboard,$i,1;} #here i delete the element if it doesn't work. I hope it's done correctly.

    }
    my $leadref= cut (@leaderboard); #here i take the first 10 scores of the AoAs
    @leaderboard = @$leadref;
    my $leaderef=expand (@leaderboard); #then i expand the AoAs by one term
    @leaderboard= @$leaderef;            #and i should end with a completely different list to work with in the while loop
}   

所以我不知道如何正确地取消引用AoAs。该计划的输出说:

“在连接(。)中使用未初始化的值$ curref或在C:\ Algorithms \ 22cyclic \ cyclospectrumsub.pl第183行中使用字符串。 不能在C:\ Algorithms \ 22cyclic \ cyclospectrumsub.pl第184行使用未定义的值作为ARRAY引用。“

我非常感谢任何见解或推荐。

2 个答案:

答案 0 :(得分:4)

问题在于splice在处理列表时修改了列表。通过使用0..(scalar @leaderboard-1)设置要在开头处理的元素范围,但是当splice删除某些元素时,列表的结束时间会短于$i在修改后的列表的末尾,您将获得未定义的引用。

快速解决方法是使用

for (my $i = 0; $i < @leaderboard; $i++) 

虽然这不是非常惯用也不高效。 请注意,执行$i < @leaderboard@leaderboard-1之类的操作已经为数组变量提供了标量上下文,因此您不需要scalar()调用,它在此处不执行任何操作。

我可能会使用像

这样的东西
my @result;
while(my $elem = shift @leaderboard) {
    ...
    if ($w==$parentmass) {
        # do more stuff
        push @result, $elem;
    }
}

因此,不是从原始列表中删除,而是所有元素都将从原始元素中删除,并且只有结果中包含的成功(通过任何标准)。

答案 1 :(得分:1)

这里似乎有两件事情

  • 您要从@leaderboard 大于 sumaarray

  • $parentmass删除所有数组
  • 您正在@Leader数组中score @leaderboard sumaarray$parentmass 等于 em> sumaarray

我不清楚这是否正确。您似乎根本没有处理$parentmass 小于 grep的情况。但是,通过将max_byList::UtilsBy模块中的use List::UtilsBy 'max_by'; my $parentmass = $spect[-1]; my @leaderboard = grep { sumaarray(@$_) <= $parentmass } @arrarraa; my $leader = max_by { score(@$_) } grep { sumaarray(@$_) == $parentmass } @leaderboard; 函数一起使用,可以非常简单地编写

sumarray

如果我理解你算法的意图,我相信这可以做得更整齐;尤其是那些$parentmass小于val otherPipe = pipe .project('fieldIwant) .map { p: Pipe => p.toString.split(",") } // converts pipe -> array .unique

的元素