我想获得长DNA序列的子串
例如,给定:
1/ATXGAAATTXXGGAAGGGGTGG
2/AATXGAAGGAAGGAAGGGGATATTX
3/AAAAAATTXXGGAAGGGGXTTTA
4/AAAATTXXATAXXGGAAGGGGXTXG
5/ATTATTGTTXAXTATTT
输出为:
1/TXG - TTXX
2/TXG -
3/ - TTXX
4/TTXX - TXG
5/ -
我尝试了以下正则表达式模式:
(TXG|TTXX)
并且它有效,结果放在列表中,但我不知道如何检索原始序列中出现的每个结果的顺序。那是,
是TTXX
和TXG
分别出现在序列4中的第一个和第二个,而第二个和第一个出现在序列1中;并且在第二和第三个结果中,这更难,因为match-xx函数调用不提供从所讨论的序列中获取的子字符串的索引。感谢您的见解。
答案 0 :(得分:3)
怎么样:
#!/usr/bin/perl
use strict;
use warnings;
use Data::Dump qw(dump);
my %res;
while(my $line = <DATA>) {
chomp$line;
while($line =~ /TXG|TTXX/g) {
push @{$res{$line}}, "found $& at pos:".(pos($line)-length($&));
}
}
dump%res;
__DATA__
ATXGAAATTXXGGAAGGGGTGG
AATXGAAGGAAGGAAGGGGATATTX
AAAAAATTXXGGAAGGGGXTTTA
AAAATTXXATAXXGGAAGGGGXTXG
ATTATTGTTXXXTATTT
<强>输出:强>
(
"ATTATTGTTXXXTATTT",
["found TTXX at pos:7"],
"AATXGAAGGAAGGAAGGGGATATTX",
["found TXG at pos:2"],
"AAAAAATTXXGGAAGGGGXTTTA",
["found TTXX at pos:6"],
"AAAATTXXATAXXGGAAGGGGXTXG",
["found TTXX at pos:4", "found TXG at pos:22"],
"ATXGAAATTXXGGAAGGGGTGG",
["found TXG at pos:1", "found TTXX at pos:7"],
)
答案 1 :(得分:0)
如果你输入2个匹配函数怎么办?
my $result="";
$result.="TXG" if(/TXG/);
$result.="TTXX" if (/TTXX/);
print $result;
答案 2 :(得分:0)
perl -ne'($a)=/(TXG)/gc;($b)=/\G.*(TTXX)/;($a,$b)=($1,$a)if$a and not$b and/(TTXX)/;m{^(\d/)};printf"$1%5s -%5s\n",$a,$b'