我有各种子程序给我数组数组。我已经单独测试了它们,不知何故,当我编写我的主程序时,我无法使程序识别我的数组。我知道这是一个解除引用的问题,或者至少我怀疑它很重要。
代码有点长,但我会尝试解释它:
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引用。“
我非常感谢任何见解或推荐。
答案 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_by
与List::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;
函数一起使用,可以非常简单地编写3>
sumarray
如果我理解你算法的意图,我相信这可以做得更整齐;尤其是那些$parentmass
小于val otherPipe = pipe
.project('fieldIwant)
.map { p: Pipe => p.toString.split(",") } // converts pipe -> array
.unique