美文网首页
发现Perl的一个特殊功能——循环匹配

发现Perl的一个特殊功能——循环匹配

作者: UnderStorm | 来源:发表于2018-12-27 23:17 被阅读30次

在李恒的github博客 On the definition of sequence identity 当中看到这样一个Perl单行代码:

$ perl -ane 'if(/NM:i:(\d+)/){$n=$1;$l=0;$l+=$1 while/(\d+)[MID]/g;print(($l-$n)/$l,"\n")}'

这行代码的目的是为了计算SAM文件中每条记录BLAST identity

BLAST identity是根据你比对到的碱基除去比对所涉及到的columns数目,换句话来说就是比对涉及到所有的碱基数目

例如这样的双序列比对:

Ref+:  1 CCAGTGTGGCCGATaCCCcagGTtgGC-ACGCATCGTTGCCTTGGTAAGC 49
         |||||||||||||| |||   ||  || ||||||||||||||||||||||
Qry+:  1 CCAGTGTGGCCGATgCCC---GT--GCtACGCATCGTTGCCTTGGTAAGC 45

它们的BLAST identity就是43/50=86%

那么要计算SAM文件中每条reads的BLAST identity,总长可以通过叠加CIGAR中对应的M/I/D的数目得到,比对到的碱基数目等于总长减去NMtag(比对不上的碱基位置的标记)

SAM文件中的NMtag

李恒的这行代码中有一部分一开始没有读懂,就是下图红框中的那部分:

其实这是一种简写方式,正规完整且更容易读懂的形式可以写成下面这样:

# 这里为了更好看,添加了适当的换行和缩进

$ perl -ane \
'if(/NM:i:(\d+)/){
    $n=$1;
    $l=0;
    while(/(\d+)[MID]/g){
        $l+=$1;
    }
    print(($l-$n)/$l,"\n");
}
'

while(/(\d+)[MID]/g)中的正则表达式/(\d+)[MID]/g,引起了我极大的好奇:它是在正则表达式后面添加了一个g字符,即开启了全局匹配,又由于是在while( )中进行的正则匹配,等于是开启了循环匹配,即对于CIGAR字符串18M3D22M,正则表达式/(\d+)[MID]/g,先会匹配上18M,然后会匹配上3D,最后匹配上22M

很有意思的用法


参考资料:

(1) Heng Li's blog: On the definition of sequence identity

(2) 【简书】生信杂谈:怎样定义sequences比对的相似度?

相关文章

  • 发现Perl的一个特殊功能——循环匹配

    在李恒的github博客 On the definition of sequence identity 当中看到这...

  • Perl Match with UTF-8

    Perl Match with UTF-8 起 尝试使用perl处理中文文档时,发现匹配时总是有BUG。测试后发现...

  • Perl 6 中的智能匹配

    智能匹配 这儿有一个标准 Perl 6(即在你的编译单元开始的时候所生效的 Perl 方言) 的智能匹配表格。智能...

  • Nginx Rewrite配置

    Nginx的rewrite功能需要PCRE软件的支持,即通过perl兼容正则表达式语句进行规则匹配的。rewrit...

  • 4.Perl、数据库

    2019.10.15 勤奋,很好的研究,更好的生活。 Perl 变量、循环、替换 #!/usr/bin/perl ...

  • 【Perl编程-6】正则表达式--匹配

    perl语言的强大之处就在于他的正则表达式,Perl的正则表达式的三种形式,分别是匹配,替换和转化: 匹配:m//...

  • perl中的循环控制结构

    摘自:Perl 语言入门(Learning Perl)last: 终止循环的执行,结束了!类似C语言中的bre...

  • Perl数据类型

    Perl是一种弱类型语言,所以不需要指定变量类型,Perl解释器会根据上下文自动选择匹配类型。Perl有三个基本的...

  • Perl:数据类型,数字字面量,变量

    Perl是一种弱类型的语言,所以变量不需要指定类型,Perl解释器会根据上下文自动选择匹配类型 Perl有三种基本...

  • Perl multiple match note 多行匹配 备忘

    今天在Perl匹配替换的时候,发现有字串只能根据上一行定位,所以导致我要把2行都匹配出来,后做替换动作 开始这样写...

网友评论

      本文标题:发现Perl的一个特殊功能——循环匹配

      本文链接:https://www.haomeiwen.com/subject/mudjlqtx.html