Переменная Область за пределами цикла foreach Perl - PullRequest
0 голосов
/ 17 июня 2019

Вот проблема: создание 10 итераций по 50 итераций и доступ к строке из 50 символов вне внутреннего цикла foreach.

Я попытался поместить итерацию 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";

}

Вывод: Corerct, но мне нужно получить доступ к $ str как естьниже, но 1010 * вне * цикл Еогеасп и в пределах первой для цикла.

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 ]

1 голос
/ 18 июня 2019

Я обнаружил, что это работает отлично: насколько я могу судить, это оказывается областью, и я не уверен, почему я застрял.Независимо от того, двигаться дальше.

#!/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;

}
1 голос
/ 17 июня 2019
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 и возвращаете только один символ - который вы (см. Выше) отбрасываете.

...