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