perl 使用正则表达式检查有效的 DNA 序列
perl check for valid DNA sequence with regex
我想编写一个子程序,将 FASTA 文件作为参数并打印出序列(不带 header)。
该子例程应检查序列是否包含 DNA 碱基(A、T、G、C)以外的任何其他字母。
这是我的代码:
scalar_sequence ("sequence.fa");
sub scalar_sequence {
my $file = $_[0];
my $sequence;
open (READ, $file) || die "Cannot open $file: $!.\n";
while (<READ>){
if (/^>/){
next;
}
if (/^[ATCG]/){
$sequence .= $_;
} else {
die "invalid sequence\n";
}
}
print $sequence, "\n";
}
当我 运行 这段代码时,我得到 'invalid sequence' 作为输出。
当我离开 'else' 时,即使序列包含另一个字母,它也会打印出序列。
有什么问题?
提前致谢!
问题出在这里/^[ATCG]/
这一行应该是/^[ATCG]+$/
您的代码应该是
chomp;
next if (/^>/); # skip for header
next if(/^\s*$/); #skip for empty line
if (/^[ATCG]+$/){
$sequence .= $_;
} else {
die "invalid sequence\n";
}
您只考虑以 A 或 T 或 G 或 C 开头的行开头。您应该扩展匹配项。
我想编写一个子程序,将 FASTA 文件作为参数并打印出序列(不带 header)。 该子例程应检查序列是否包含 DNA 碱基(A、T、G、C)以外的任何其他字母。
这是我的代码:
scalar_sequence ("sequence.fa");
sub scalar_sequence {
my $file = $_[0];
my $sequence;
open (READ, $file) || die "Cannot open $file: $!.\n";
while (<READ>){
if (/^>/){
next;
}
if (/^[ATCG]/){
$sequence .= $_;
} else {
die "invalid sequence\n";
}
}
print $sequence, "\n";
}
当我 运行 这段代码时,我得到 'invalid sequence' 作为输出。 当我离开 'else' 时,即使序列包含另一个字母,它也会打印出序列。
有什么问题?
提前致谢!
问题出在这里/^[ATCG]/
这一行应该是/^[ATCG]+$/
您的代码应该是
chomp;
next if (/^>/); # skip for header
next if(/^\s*$/); #skip for empty line
if (/^[ATCG]+$/){
$sequence .= $_;
} else {
die "invalid sequence\n";
}
您只考虑以 A 或 T 或 G 或 C 开头的行开头。您应该扩展匹配项。