2012-08-07 50 views
1

我有以下字符串。 实际上,大小可以变化。使用Perl将K个字符提取到标记的左侧和右侧

my $string = "ACCAGGGGGGCCTCCGCAG*AAGCGGTCGCCATAGTCAAAC"; 

我想要做的是提取10个字符的*标记的左侧和右侧, 导致:

my $output = "GCCTCCGCAG*AAGCGGTCGC"; 

是有一个紧凑的方式做到这一点在Perl?

+0

你说“标记”,这意味着可以有多个?他们会不会在彼此的10个字符之内?如果是这样,你想为'AAGTAAGTAAGT * AAGT * AAGTAAGTAAGT'输出什么? – ikegami 2012-08-07 04:41:07

+0

@ikegami:我的意思是只有1个标记。我编辑了我的OP。感谢您指出这一点。 – neversaint 2012-08-07 05:18:48

回答

6

你去那里:

my $string = "ACCAGGGGGGCCTCCGCAG*AAGCGGTCGCCATAGTCAAAC"; 
my $output = substr($string, index($string, '*') - 10, 21); 
6

这里有一个快速简便的方法使用正则表达式来做到这一点。两个{10}代表每边匹配的字符数。

my ($output) = $string =~ m{(.{10}\*.{10})}; 
+1

您可能想要制作'。{0,10}',否则如果您在上下文短于10个字符的情况下获得匹配,则不会打印任何内容。 – tripleee 2012-08-07 03:31:54

+0

这是一个很好的观点,但我怀疑这可能会导致*总是在某些情况下捕获太少的上下文。先将每个末端的'' - 'x 10'粘贴起来可能会更容易! – duskwuff 2012-08-07 03:35:01

+0

贪婪的重复运算符将始终匹配最长的字符串。 – tripleee 2012-08-07 03:36:52

相关问题