因此,我想要更改传递给子例程的数字,然后保留这些更改过的数字,但这似乎不起作用。
my $A = 0;
my $T = 0;
my $C = 0;
my $G = 0;
foreach my $bases in (keys %basereads){
count ($bases, $A, $T, $C, $G);
}下面是我的子例程
sub count {
my $bases = shift;
my $A = shift;
my $T = shift;
my $C = shift;
my $G = shift;
for (my $i = 0; $i < length($bases); $i++){
print "$bases\t";
if (uc(substr($bases,$i,1)) eq 'A'){
$A++;
}elsif (uc(substr($bases,$i,1)) eq 'T'){
$T++;
} elsif (uc(substr($bases,$i,1)) eq 'G'){
$G++;
} elsif (uc(substr($bases,$i,1)) eq 'C'){
$C++;
} else { next; }
}
print "$A\t$C\t$T\t$G\n";
return my($bases, $A, $T, $C, $G);
}在子例程之后,我想将修改后的A、C、T、G存储到一个hashmap中。当我在子例程中打印bases和ATCG时,它会打印,所以我知道计算机正在通过子例程运行,但它没有保存它,当我试图在子例程外操作它时(在我调用它之后),它从零开始(我之前定义了四个碱基)。我是Perl的新手,所以我对子例程有点厌烦。有人能帮帮忙吗?
发布于 2014-07-03 07:13:25
始终在每个脚本的顶部包含use strict;和use warnings;。
启用warnings后,您应该会收到以下消息:
"my" variable $bases masks earlier declaration in same scope at script.pl line ...
"my" variable $A masks earlier declaration in same scope at script.pl line ...
"my" variable $T masks earlier declaration in same scope at script.pl line ...
"my" variable $C masks earlier declaration in same scope at script.pl line ...
"my" variable $G masks earlier declaration in same scope at script.pl line ...这些是由return语句前的my引起的:
return my($bases, $A, $T, $C, $G);只需删除my即可纠正此错误
return ($bases, $A, $T, $C, $G);然后,您只需要捕获返回值
($bases, $A, $T, $C, $G) = count($bases, $A, $T, $C, $G);考虑到您是perl的新手,我相信您不会对您的代码可以被进一步清理感到惊讶。如果使用散列,则可以更容易地计算字符串中的各种字符,如下所示:
use strict;
use warnings;
my $A = 0;
my $T = 0;
my $C = 0;
my $G = 0;
foreach my $bases (keys %basereads) {
my %counts;
for my $char (split //, $bases) {
$counts{$char}++;
}
$A += $counts{A};
$T += $counts{T};
$C += $counts{C};
$G += $counts{G};
}https://stackoverflow.com/questions/24542499
复制相似问题