这是问题所在: 生成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;
}
}
答案 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;
}