【问题标题】:perl check for valid DNA sequence with regexperl 使用正则表达式检查有效的 DNA 序列
【发布时间】:2017-06-14 09:41:21
【问题描述】:

我想编写一个以 FASTA 文件作为参数并打印出序列(不带标题)的子例程。 子程序应检查序列是否包含除 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";
}

当我运行此代码时,我得到“无效序列”作为输出。 当我将“else”省略时,即使序列包含另一个字母,它也会打印出序列。

有什么问题?

提前致谢!

【问题讨论】:

  • ^ 应该在 [] 中:if (/[^ATCG]/)
  • 好的,现在它打印序列而不是错误消息,但是:即使它包含无效字母,它也会打印序列
  • 也不起作用:/
  • 请注意:bioperl 的 seqIO 比在本机 perl 中读取 fasta 文件快约 10 倍。如果您正在处理高等生物(大基因组),这可能是一个巨大的福音。

标签: regex perl bioinformatics dna-sequence bioperl


【解决方案1】:

问题出在/^[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 开头的行的开头。您应该扩展匹配项。

【讨论】:

  • 也不起作用,即使序列有效也会打印出“无效序列”
  • @ic23oluk 因为换行。在您的脚本中添加chomp
  • @ic23oluk 在每个 fasta 文件的最后一行是一个新行。请从您的 else 条件中删除 die。并打印$sequence
  • 这不是我想要的:如果我省略了“死”,即使它包含无效字母,它也会打印序列,但没有这些无效字母所在的行。我想编写一个算法,当包含一个或多个无效字母时停止并返回错误消息
  • 当删除 fasta 文件中的最后一个换行符时,它可以正常工作,但我怎样才能自动执行此操作?
猜你喜欢
  • 1970-01-01
  • 2010-10-18
  • 2013-04-29
  • 2017-06-21
  • 2013-09-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多