首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Perl:子例程中的更改不会在例程之外打印

Perl:子例程中的更改不会在例程之外打印
EN

Stack Overflow用户
提问于 2014-07-03 07:08:55
回答 1查看 92关注 0票数 0

因此,我想要更改传递给子例程的数字,然后保留这些更改过的数字,但这似乎不起作用。

代码语言:javascript
运行
复制
    my $A = 0;
    my $T = 0;
    my $C = 0;
    my $G = 0;   

     foreach my $bases in (keys %basereads){
          count ($bases, $A, $T, $C, $G);
    }

下面是我的子例程

代码语言:javascript
运行
复制
    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的新手,所以我对子例程有点厌烦。有人能帮帮忙吗?

EN

回答 1

Stack Overflow用户

发布于 2014-07-03 07:13:25

始终在每个脚本的顶部包含use strict;use warnings;

启用warnings后,您应该会收到以下消息:

代码语言:javascript
运行
复制
"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引起的:

代码语言:javascript
运行
复制
return my($bases, $A, $T, $C, $G);

只需删除my即可纠正此错误

代码语言:javascript
运行
复制
return ($bases, $A, $T, $C, $G);

然后,您只需要捕获返回值

代码语言:javascript
运行
复制
($bases, $A, $T, $C, $G) = count($bases, $A, $T, $C, $G);

考虑到您是perl的新手,我相信您不会对您的代码可以被进一步清理感到惊讶。如果使用散列,则可以更容易地计算字符串中的各种字符,如下所示:

代码语言:javascript
运行
复制
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};
}
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/24542499

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档