我想写一段代码的问题。我的问题是基于两个数组及其包含的元素。
我有两个数字填充数字(与字符串中的位置有关)。我希望选择位置之间的子串。第一个数组中的元素是子字符串的开头,第二个数组中的元素是子字符串的末尾。
我提供的代码读入文件并使其成为字符串:
>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);
嗨borodin,你绝对正确..我现在编辑了代码!感谢您查看与长度问题相关的内容。奇怪偏移的原因是@ rs2_array中的值是起始位置,在这种情况下它没有考虑单词“ted”的其余部分,我需要这个来完成字符串。数组正确构建为对于@ rs1_array中的元素,它们代表起始位置“emi”@ rs2_array元素也保持每个“ted”的起始位置,因为字符串中有2个emi和3个ted导致不平衡。
答案 0 :(得分: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;