劉小澤寫(xiě)于18.12.2
這個(gè)周末做了不少事豹悬,參加了P4 China精準(zhǔn)醫(yī)療會(huì)議玄括,第一次參加這種國(guó)際性會(huì)議卒茬,長(zhǎng)了不少見(jiàn)識(shí),同時(shí)帶回來(lái)很厚一摞“背景知識(shí)” 來(lái)學(xué)習(xí)(各個(gè)公司的手冊(cè)酥筝,這個(gè)詞是和jimmy學(xué)的??滚躯,學(xué)無(wú)止境,學(xué)無(wú)止境)嘿歌;
周六下午參加了生信技能樹(shù)舉辦的小party掸掏,認(rèn)識(shí)了一幫志同道合的小伙伴,還有當(dāng)時(shí)學(xué)習(xí)轉(zhuǎn)錄組時(shí)默默關(guān)注的“青山屋主”老師搅幅≡氖可能大家做的方向不同呼胚,但是能感受到那份共同對(duì)于生信的熱情和相互學(xué)習(xí)的動(dòng)力茄唐;另外從熊那里學(xué)到了新的Evernote知識(shí)管理體系LTF(List,Tag蝇更,F(xiàn)ilter)沪编,不愧是印象筆記中國(guó)區(qū)大使,之前也在用evernote年扩,但是沒(méi)有利用好tag蚁廓,這次周日用了一天更新了自己的知識(shí)庫(kù)tag,希望日后用的越來(lái)越6吧
今天看一下關(guān)于perl的一些小知識(shí)
基本知識(shí)
- 標(biāo)量
$
厨幻、數(shù)組@
相嵌、哈希%
【分別用小括號(hào)腿时、中括號(hào)、大括號(hào)取元素】 - perl語(yǔ)句都以分號(hào)結(jié)尾
- 賦值是從右到左
- 文本用單引號(hào)或者雙引號(hào)
- 單引號(hào)把其中所有變?yōu)槲谋痉贡觯浑p引號(hào)可以用轉(zhuǎn)義符
- 列表用小括號(hào)批糟,其中元素逗號(hào)分隔
- perl從0開(kāi)始計(jì)數(shù)
perl運(yùn)算符
# 基本數(shù)學(xué)運(yùn)算
print 3 * (5 + 10) - 2**4;
# 變量運(yùn)算
$total_error = $false_positive + $false_negative;
# 增加固定數(shù)值
$minutes += 30;
# 每次加一
$hour++;
# 每次減一
$remaining--;
# 重復(fù)多少次
$motif = 'CG' x 12;
# 連接字符串和變量?jī)?nèi)容
$chr = 'chr' . $roman{$chr_number};
# 從小到大
@hex = (1..9, a..f);
perl函數(shù)
# 標(biāo)量函數(shù)
$seq_len = length($seq);
$rev_seq = reverse($seq);
$upper_case = uc($seq);
$lower_case = lc($seq);
$codon = substr $seq, 0, 3;
# 去掉結(jié)尾空白
chomp $input_line;
# 數(shù)組函數(shù)
@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;
# 哈希函數(shù)
if (defined $description{$gene}) { print $description{$gene} } else { print 'not available'; }
foreach (keys %headers) { print ">$_\n$headers{$_}\n"; }
循環(huán)、判斷
'>', '<', '==' 或者'gt', 'lt', 'eq'
# 準(zhǔn)確查找motif
if (substr($seq, $pos, 10) eq $motif) { print "Motif found at position $pos!\n"; }
# 每一行都變成小寫(xiě)字母再合并
while (<>) { chomp; $seq .= lc $_; }
正則表達(dá)
在/
中展示看铆,通過(guò)=~
應(yīng)用徽鼎,再加上限定(i表示大小寫(xiě)區(qū)分;g表示全局比對(duì))
特殊字符比如:字母用'\w'
弹惦,數(shù)字用'\d'
否淤,空格用'\s'
【反選用'\D'
, '\W','\S'
】
出現(xiàn)次數(shù)出現(xiàn)在大括號(hào)中棠隐,如:'{3}'即3次石抡;'{4,10}'4到10次;'{2,}'兩次以上
'+'
比對(duì)至少一個(gè)助泽;'*'
0個(gè)或多個(gè)汁雷;'?'
0個(gè)或1個(gè)
# search $_ for the word regulator (ignoring case) and print if found
if (/regulator/i) { print;}
# 找非數(shù)字字符
if ($input =~ /\D/) { warn "Non-numerical input in '$input'\n"; }
# 移除所有空格
$input =~ s/\s//g;
# CG至少出現(xiàn)3次
if ($input =~ /(CG{3,})/) { print "Found pattern $1!\n"; }
# 將字符串按tab分隔,然后整合到數(shù)組
@list = split /\t/, $input;
單行perl
與One-Liner相關(guān)的perl參數(shù)
-a 自動(dòng)分隔模式
-F 指定-a的分隔符
-l 對(duì)輸入的內(nèi)容進(jìn)行自動(dòng)chomp报咳,對(duì)輸出的內(nèi)容自動(dòng)加換行符
-n 相當(dāng)于while(<>)
-e 執(zhí)行命令侠讯,也就是腳本
-p 自動(dòng)循環(huán)+輸出,也就是while(<>){命令(腳本); print;}
perl -e 必須要寫(xiě)
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*$//'
幾個(gè)小例子
perl -e 'print "hello world\n"' #結(jié)果加換行符
perl -l -e 'print 2**13' #結(jié)果輸出到新行
perl -lne '$i++; $in += length($_); END { print "$i lines, $in characters"; }' input.txt #讀取文件并統(tǒng)計(jì)行數(shù)與字符數(shù)
perl -lne '$i++; $in += length($_); $w += scalar split /\s+/, $_; END { print "$i lines, $w words, $in characters"; }' input.txt # 增加統(tǒng)計(jì)單詞數(shù)
perl -le 'foreach (1..100) { print rand;}' > random_numbers.txt #1-100取隨機(jī)數(shù)并輸出到文件
# 對(duì)于逗號(hào)分隔的文件暑刃,將最后一列提到第一列
perl -F, -lane 'print(join ",", @F[-1,0..$#F-1])'
# 空格分隔的文件厢漩,將第三列降序排列
perl -lane '$s{$F[2]} .= $_; END {foreach (sort { $b <=> $a } kyes %s) {print $s{$_}; }}'
# 改變基因坐標(biāo),確保起始位點(diǎn)始終小與終止位點(diǎn)
perl -lane '($F[3],$F[2]) = ($F[2], $F[3]) if ($F[3] lt $F[2]); print (join "\t", @F);' input
歡迎關(guān)注我們的公眾號(hào)~_~
我們是兩個(gè)農(nóng)轉(zhuǎn)生信的小碩岩臣,打造生信星球溜嗜,想讓它成為一個(gè)不拽術(shù)語(yǔ)、通俗易懂的生信知識(shí)平臺(tái)架谎。需要幫助或提出意見(jiàn)請(qǐng)后臺(tái)留言或發(fā)送郵件到Bioplanet520@outlook.com