0

我想写的一段代码有问题。我的问题基于两个数组及其包含的元素。

我有两个用数字填充的数组(与字符串中的位置有关)。我希望选择位置之间的子字符串。第一个数组中的元素是子字符串的开头,第二个数组中的元素是子字符串的结尾。

我提供的代码读取文件并使其成为字符串:

>demo_data
theoemijono
milotedjonoted
dademimamted

细绳:

theoemijonomilotedjonoteddademimamted

所以我想要发生的是提取子字符串

emijonomiloted

emimamted

我编写的代码采用第一个元素数组并将其与第二个数组对应元素进行比较,然后确保没有交叉,因此保持子字符串以 emi 开头并以 tedas 结尾,在提供的序列中看到

for($i=0; $i<=10; $i++)
{

    if ($rs1_array[$i] < $rs2_array[$i] && $rs1_array[$i+1] > $rs2_array[$i])
    {
        my$size= $rs2_array[$i]-$rs1_array[$i]+ 3);
        my$substr= substr($seq, $rs1_array[$i],$size);
        print $substr."\n";
    }
}

使用此代码适用于第一个子字符串,但第二个子字符串被忽略,因为第一个数组的元素较少,因此无法完成比较。

更新

数组结构:

@rs1_array = (4, 28);
@rs2_array = (15, 22, 34);

嗨,鲍罗丁,你说的完全正确。我现在已经编辑了代码!感谢您看到与长度问题有关的内容。奇怪偏移的原因是@rs2_array 中的值是起始位置,在这种情况下它没有考虑单词“ted”的其余部分,我需要它来完成字符串。数组正确构建为对于@rs1_array 中的元素,它们表示起始位置“emi”,@rs2_array 元素还保存每个“ted”的起始位置,因此字符串中有 2 个 emi 和 3 个 ted,这会导致不平衡。

4

1 回答 1

0
my @starts = ( 4, 28 );
my @ends   = map $_+3, ( 15, 22, 34 );

my $starts_idx = my $ends_idx = 0;
while ($starts_idx < @starts && $ends_idx < @ends) {
   if ($starts[$start_idx] > $ends[$ends_idx]) {
      ++$start_idx;
      next;
   }

   my $length = $ends[$ends_idx] - $starts[$start_idx];
   say substr($seq, $starts[$start_idx], $length);

   ++$ends_idx;
   ++$start_idx;
}

当然,它给出的输出与以下内容相同:

say for $seq =~ /(emi(?:(?!emi|ted).)*ted)/sxg;
于 2013-04-25T05:11:07.500 回答