我正在解析fasta对齐文件,其中包含
gi|216CCAACGAAATGATCGCCACACAA
gi|21-GCTGGTTCAGCGACCAAAAGTAGC
我想将此字符串拆分为:
gi|216 CCAACGAAATGATCGCCACACAA
gi|21- GCTGGTTCAGCGACCAAAAGTAGC
对于第一个字符串,我使用
$aar=split("\d",$string);
但这没有用。我应该怎么办?
我正在解析fasta对齐文件,其中包含
gi|216CCAACGAAATGATCGCCACACAA
gi|21-GCTGGTTCAGCGACCAAAAGTAGC
我想将此字符串拆分为:
gi|216 CCAACGAAATGATCGCCACACAA
gi|21- GCTGGTTCAGCGACCAAAAGTAGC
对于第一个字符串,我使用
$aar=split("\d",$string);
但这没有用。我应该怎么办?
所以你正在解析一些遗传数据,每行都有一个gi|
前缀,后跟一系列数字和连字符,然后是核苷酸序列?如果是这样,您可以执行以下操作:
my ($number, $nucleotides);
if($string =~ /^gi\|([\d-]+)([ACGT]+)$/) {
$number = $1;
$nucleotides = $2;
}
else {
# Broken data?
}
这假设您已经去掉了前导和尾随空格。如果你这样做,你应该得到第一个和$number = '216'
第二个的and 。$nucleotides = 'CCAACGAAATGATCGCCACACAA'
$number = '216-'
$nucleotides = 'GCTGGTTCAGCGACCAAAAGTAGC'
看起来BioPerl有一些东西可以处理 fasta 数据,所以你可能想使用 BioPerl 的工具而不是自己动手。
这就是我将如何去做。
#!/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
如果您只想添加一个空格(无法从您的问题中真正看出),请使用替换。在ACTG的任何分组前放置一个空格:
$string =~ s/([ACTG]+)/ \1/;
或在任何数字和破折号分组后添加一个选项卡:
$string =~ s/([\d-]+)/\1\t/;
请注意,这将$string
在原地替换。