【发布时间】:2018-02-01 09:27:08
【问题描述】:
我最近正在处理一个规模很大的项目,我正在重写代码以使其更加面向对象,并将所有冗余代码传递到子例程中。
脚本检查数据库中是否存在基因(通过各种方式)。它还可能报告可能的重复项。在报告重复之前,脚本会确保它不是“生物重复”(本质上是相同的生物数据,但在基因组中具有不同的位置,因此不是实际的重复)。为了做到这一点……
my @gene_ids;
my @gene_names;
while(my $gene = $geners_bychecksum->next){
my $gene_name = $gene->gene_name;
my $gene_id = $gene->gene_id;
push @gene_ids, $gene_id;
push @gene_names, $gene_name;
}
print STDERR "$id\tJ\tALERT CHECKSUM MULTI-HIT\t(".join(",",@gene_names).")\n";
my $solve_multihit = solve_multihit($id, \@gene_names, \@gene_ids, $spc, $species_directory, $dataset);
print STDERR "$id\tJ\tALERT CHECKSUM MULTI-HIT\t(".join(",",@gene_names).")\n";
if($solve_multihit){
print STDERR "$id\tM\tUPDATE \n";
print $report "$id\tM\tUPDATE \n";
$countM++;
} else {
print STDERR "$id\tJ\tALERT CHECKSUM MULTI-HIT\t(".join(",",@gene_names).")\n";
}
这里,$geners_bychecksum 是一个 DBIC 结果集,其中包含来自先前搜索的数据库命中,对于这种情况,它总是有超过 1 个基因。 $id,$spc,$species_directory 和 $dataset 都是来自配置的字符串并在此块之上定义。
solve_multihit 子例程是一个相当复杂的函数,它试图解析多重命中是实际重复还是生物重复。请注意,我将 @gene_names 和 @gene_ids 数组传递给此函数。如果能够解决差异,此函数将返回正确基因的gene_id;如果不是,则为 0。 sub的简化代码可以在以下链接中找到
实际问题
你可能已经注意到了
print STDERR "$id\tJ\tALERT CHECKSUM MULTI HIT\t(".join(",",@gene_names).")\n";
在 solve_multihit 子例程调用之前和之后...根据 STDERR,运行函数后数组似乎变空:
BBOV_I005030 J ALERT CHECKSUM MULTI-HIT (XP_001609152.1,XP_001609157.1)
BBOV_I005030 J ALERT CHECKSUM MULTI-HIT ()
BBOV_I005040 J ALERT CHECKSUM MULTI-HIT (XP_001609156.1,XP_001609153.1)
BBOV_I005040 J ALERT CHECKSUM MULTI-HIT ()
BBOV_I005050 J ALERT CHECKSUM MULTI-HIT (XP_001609154.1,XP_001609155.1)
BBOV_I005050 J ALERT CHECKSUM MULTI-HIT ()
BBOV_I005060 J ALERT CHECKSUM MULTI-HIT (XP_001609154.1,XP_001609155.1)
BBOV_I005060 J ALERT CHECKSUM MULTI-HIT ()
BBOV_I005070 J ALERT CHECKSUM MULTI-HIT (XP_001609156.1,XP_001609153.1)
BBOV_I005070 J ALERT CHECKSUM MULTI-HIT ()
BBOV_I005080 J ALERT CHECKSUM MULTI-HIT (XP_001609152.1,XP_001609157.1)
BBOV_I005080 J ALERT CHECKSUM MULTI-HIT ()
为什么会这样?我很确定我可以通过返回数组以及solve_multihit{} 子的结果来解决它,但我想知道为什么它会变空。
PS:报告中的J只是一个case-scenario key code。
【问题讨论】:
-
solve_multihit()中显然有一些东西修改了输入数组(肯定是@gene_names,也可能还有@gene_ids),但我们只能猜测那个“东西”是什么而没有看到里面有什么子。是否可能使用shift或pop来访问数组的内容? -
我不知道我可以修改输入!我会将子添加到帖子中。谢谢
-
@zdim, Re "函数参数是别名的,如果你改变@_你就会改变它们。",改变
@_不会有描述的效果。更改@{ $_[1] }会。 -
@ikegami 对,谢谢。这是对最初评论的仓促和笨拙的“修复”,不精确到错误的程度。我正在删除评论。谢谢
标签: arrays perl subroutine bioperl