2012-08-07 49 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

相關問題