060-一些perl的小技巧

刘小泽写于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
Yunze Liu
Yunze Liu
Bioinformatics Sharer

Co-founder of Bioinfoplanet(生信星球)

Next
Previous

Related