2012-12-15 19 views
-3

我解析包含如何在Perl中以這種格式'gi | 216 ATGCTGTGCTGATGCTG'拆分這個字符串'gi | 216ATGCTGATGCTGTG'?

gi|216CCAACGAAATGATCGCCACACAA 
gi|21-GCTGGTTCAGCGACCAAAAGTAGC 

的FASTA比文件我想這個字符串分割成這樣:

gi|216 CCAACGAAATGATCGCCACACAA 
gi|21- GCTGGTTCAGCGACCAAAAGTAGC 

對於第一個字符串,我用

$aar=split("\d",$string); 

但是,沒沒有工作。我該怎麼辦?

+0

您能否描述您的要求?什麼地方出了問題,你怎麼想這個字符串?你有一個例子,但沒有解釋!請編輯您的問題並更新它(問題關閉前快速填寫) – gideon

+1

請解釋您的需求:是否總是有一個*欄*,一些小數,後面跟着一個大寫或罷工!?你會保留一切還是隻保留一個或某個特定部分? –

+1

始終使用'use strict;使用警告;'!!!這應該是'split(/ \ d /,$ string)' – ikegami

回答

3

所以你解析一些基因數據,每行有一個前綴gi|,然後是數字和連字符序列,然後是核苷酸序列?如果是這樣,你可以做這樣的事情:

my ($number, $nucleotides); 
if($string =~ /^gi\|([\d-]+)([ACGT]+)$/) { 
    $number  = $1; 
    $nucleotides = $2; 
} 
else { 
    # Broken data? 
} 

這假定你已經剝去了前導和尾隨的空白。如果你這樣做,你應該得到第一個爲$number = '216'$nucleotides = 'CCAACGAAATGATCGCCACACAA',第二個爲$number = '216-'$nucleotides = 'GCTGGTTCAGCGACCAAAAGTAGC'

看起來像BioPerl有一些處理fasta數據的東西,所以你可能想使用BioPerl的工具,而不是滾動你自己的。

+0

感謝它的工作和對我的幫助... – user1905797

2

下面是我如何去做這件事。

#!/usr/bin/perl -Tw 

use strict; 
use warnings; 
use Data::Dumper; 

while (my $line = <DATA>) { 

    my @strings = 
     grep {m{\A \S+ \z}xms}      # no whitespace tokens 
     split /\A (\w+ \| [\d-]+)([ACTG]+) /xms, # capture left & right 
     $line; 

    print Dumper(\@strings); 
} 

__DATA__ 
gi|216CCAACGAAATGATCGCCACACAA 
gi|21-GCTGGTTCAGCGACCAAAAGTAGC 
1

如果你只是想添加一個空格(不能真正從你的問題告訴),使用substitution。爲了把空間 ACTG的任何分組面前:

$string =~ s/([ACTG]+)/ \1/; 

或數字和破折號任何分組後添加一個標籤:

$string =~ s/([\d-]+)/\1\t/; 

注意,這將在地方替代上$string

+0

這些DNA序列可以是任意長度的,所以你的第一種方法往往變得越來越無效,因爲正則表達式捕捉有時非常長的字符串。你的第二種方法更好,因爲它只需要替換前幾個字符。 – mpe