一些perl的小技巧

作者: 刘小泽 | 来源:发表于2018-12-02 18:46 被阅读115次

    刘小泽写于18.12.2

    这个周末做了不少事,参加了P4 China精准医疗会议,第一次参加这种国际性会议,长了不少见识,同时带回来很厚一摞“背景知识” 来学习(各个公司的手册,这个词是和jimmy学的😂,学无止境,学无止境);
    周六下午参加了生信技能树举办的小party,认识了一帮志同道合的小伙伴,还有当时学习转录组时默默关注的“青山屋主”老师。可能大家做的方向不同,但是能感受到那份共同对于生信的热情和相互学习的动力;另外从熊那里学到了新的Evernote知识管理体系LTF(List,Tag,Filter),不愧是印象笔记中国区大使,之前也在用evernote,但是没有利用好tag,这次周日用了一天更新了自己的知识库tag,希望日后用的越来越6吧

    18.12.1充实的周末

    今天看一下关于perl的一些小知识

    基本知识

    • 标量$、数组@、哈希%【分别用小括号、中括号、大括号取元素】
    • perl语句都以分号结尾
    • 赋值是从右到左
    • 文本用单引号或者双引号
    • 单引号把其中所有变为文本;双引号可以用转义符
    • 列表用小括号,其中元素逗号分隔
    • perl从0开始计数

    perl运算符

    # 基本数学运算
    print 3 * (5 + 10) - 2**4;  
    
    # 变量运算
    $total_error = $false_positive + $false_negative;  
    
    # 增加固定数值
    $minutes += 30;      
    
    # 每次加一
    $hour++;              
    
    # 每次减一
    $remaining--;    
    
    # 重复多少次
    $motif = 'CG' x 12;  
    
    # 连接字符串和变量内容
    $chr = 'chr' . $roman{$chr_number};   
    
    # 从小到大
    @hex = (1..9, a..f);  
    

    perl函数

    # 标量函数
    $seq_len = length($seq);
    $rev_seq = reverse($seq);
    $upper_case = uc($seq);
    $lower_case = lc($seq);
    $codon = substr $seq, 0, 3;
    
    # 去掉结尾空白
    chomp $input_line;            
    
    # 数组函数
    @array = split //, $string;
    $first_element = shift @array; 
    $last_element = pop @array;
    unshift @array, $first_element;
    push @array, $last_element;
    @alphabetically_sorted = sort @names;
    @numerically_sorted = sort { $a <=> $b } @values;
    
    # 哈希函数
    if (defined $description{$gene}) { print $description{$gene} } else { print 'not available'; }
    foreach (keys %headers) { print ">$_\n$headers{$_}\n"; }
    
    

    循环、判断

     '>', '<', '==' 或者'gt', 'lt', 'eq' 
     # 准确查找motif
    if (substr($seq, $pos, 10) eq $motif) { print "Motif found at position $pos!\n"; }
    
    # 每一行都变成小写字母再合并
    while (<>) { chomp; $seq .= lc $_; }
    

    正则表达

    /中展示,通过=~应用,再加上限定(i表示大小写区分;g表示全局比对)

    特殊字符比如:字母用'\w',数字用'\d',空格用'\s'【反选用'\D', '\W','\S'

    出现次数出现在大括号中,如:'{3}'即3次;'{4,10}'4到10次;'{2,}'两次以上

    '+'比对至少一个;'*' 0个或多个;'?' 0个或1个

    # search $_ for the word regulator (ignoring case) and print if found
    if (/regulator/i) { print;}
    
    # 找非数字字符
    if ($input =~ /\D/) { warn "Non-numerical input in '$input'\n"; }
    
    # 移除所有空格
    $input =~ s/\s//g;
    
    # CG至少出现3次
    if ($input =~ /(CG{3,})/) { print "Found pattern $1!\n"; }
    
    # 将字符串按tab分隔,然后整合到数组
    @list = split /\t/, $input;
    

    单行perl

    与One-Liner相关的perl参数

    -a 自动分隔模式
    -F 指定-a的分隔符
    -l 对输入的内容进行自动chomp,对输出的内容自动加换行符
    -n 相当于while(<>)
    -e 执行命令,也就是脚本
    -p 自动循环+输出,也就是while(<>){命令(脚本); print;}

    perl -e 必须要写
    perl -pe 读取每行=》处理=〉输出 ex. perl -pe 's/aaa/AAA/g' 1.txt
    perl -ln 效果等于 while(<>){chomp;}
    perl -alne 处理tab分割文件 如 perl -alne 'print $F[0]'
    perl -ne '/regex/ && print' 打印匹配的行
    
    perl -ne 'print if /foo/' acts a lot like grep foo, 
    perl -pe 's/foo/bar/' replaces foo with bar
    perl -lpe 's/\s*$//'
    

    几个小例子

    perl -e 'print "hello world\n"' #结果加换行符
    perl -l -e 'print 2**13' #结果输出到新行
    perl -lne '$i++; $in += length($_); END { print "$i lines, $in characters"; }' input.txt #读取文件并统计行数与字符数
    perl -lne '$i++; $in += length($_); $w += scalar split /\s+/, $_; END { print "$i lines, $w words, $in characters"; }' input.txt # 增加统计单词数
    perl -le 'foreach (1..100) { print rand;}' > random_numbers.txt #1-100取随机数并输出到文件
    
    # 对于逗号分隔的文件,将最后一列提到第一列
    perl -F, -lane 'print(join ",", @F[-1,0..$#F-1])' 
    
    # 空格分隔的文件,将第三列降序排列
    perl -lane '$s{$F[2]} .= $_; END {foreach (sort { $b <=> $a } kyes %s) {print $s{$_}; }}'
    
    # 改变基因坐标,确保起始位点始终小与终止位点
    perl -lane '($F[3],$F[2]) = ($F[2], $F[3]) if ($F[3] lt $F[2]); print (join "\t", @F);' input
    

    欢迎关注我们的公众号~_~  
    我们是两个农转生信的小硕,打造生信星球,想让它成为一个不拽术语、通俗易懂的生信知识平台。需要帮助或提出意见请后台留言或发送邮件到Bioplanet520@outlook.com

    Welcome to our bioinfoplanet!

    相关文章

      网友评论

        本文标题:一些perl的小技巧

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