foreach循环Perl外的可变作用域

时间:2019-06-17 04:47:47

标签: perl for-loop foreach scope nested

这是问题所在: 生成10次迭代(共50次迭代),并在内部foreach循环外部访问50个字符串。

我尝试将50x迭代放入一个子函数中并调用它,但这没有成功。 到目前为止,无论它是否在子函数中,我都只会在foreach循环外得到一个字符。我相当确定这是我看不到的范围问题。

所以,代码:

#!/usr/bin/perl
use strict;
use warnings;

my @dna = ('A','G','T','C');
my $i;
my $str;

for ($i=1; $i<11; $i++){
    #print $i . " ";

    foreach(1..50){
        my $nt = int(rand $#dna + 1);
        $str = $dna[$nt];
        #correct here all 50 nts
        print $str;
    }

#single nt here
#print $str;
print "\n";

}

输出:正确,但是我需要按如下方式访问$ str,但是在第一个for循环中的 外部 foreach循环内。

TGATTAGCGTCCGCGCGTATTGTATTAAGCCACAGAATGTAATGCCAAGA GCTATAGGAAGACGCCGATCCCTGGACCGGCACAGGCACGGTAACAGCAG TTGTTGTAGGATCCCAGGGAGCGAAGCACGTGAACTGCGACTAATTTCAA TAACCAGGCAACACTAAACAGCTCCCATGTGTAAGGACGTATAGGCAGTT GTAATTGTAGATCACAAAATTTACACGGTATAGCATTAACTGGAACCTGC AACAGTGCCGTTTATTAATCTCCTCTAGTGTAGGGACGAATCGACCACGG CGTGAGCAAGCACAAATATCCTTTAGGGGTGTGCTTAAAACACCCAGTAG GAGTTCATAGGCCAACAATATGGCAAAGCCTTGCCCCATCAAATTCGGCG TTGCGTCTGCGAACACTGTTGGTGTGCCTTTAGTGCGGGTTACTCGAGAA CGCGATCTCCGTTTATAACGCTAGCAAACTACTACGGACCGAGGCATCGC

我删除了字符串中多余的空格。是多余的。

这是无济于事的尝试:

use strict;
use warnings;

my $str;
my @dna = ('A','G','T','C');

for (my $i=1; $i<11; $i++){
    fifty();
    print $str;
}

sub fifty {
    foreach (1 .. 50){
        my $nt = int(rand $#dna + 1);
        $str = $dna[$nt];
        return $str;
    }
}

2 个答案:

答案 0 :(得分:1)

for (my $i=1; $i<11; $i++){
    fifty();

fifty中,您返回了一些东西,但是却丢弃了ist,因为您没有像$str= fifty();这样的分配

    print $str;
}

在这里,您打印出的东西似乎还没有值-实际上,您在fifty中分配了一个值-但您不应使用全局变量。

sub fifty {
    foreach (1 .. 50){
        my $nt = int(rand $#dna + 1);
        $str = $dna[$nt];

在这里,您丢弃$str中的所有内容,而是分配一个字母。另外,您还要分配一个全局变量-应该避免使用。

        return $str;
    }
}

在这里,您直接离开fifty并仅返回一个字符-您(请参见上文)将其丢弃。

答案 1 :(得分:1)

我发现这很正常:据我所知,这只是范围而已,我不确定为什么会被卡住。无论如何,请继续前进。

#!/usr/bin/perl
use strict;
use warnings;

my @dna = ('A','G','T','C');
my $i;
my $str;

for ($i=1; $i<11; $i++){
    my $filename = "seq_" . $i;
    open(my $OUT, '>', $filename) or die("Can't open $filename($!)");

    foreach(1..50){
        my $nt = int(rand $#dna + 1);
        $str = $dna[$nt];
        print $OUT $str;
    }

close $filename;

}