為什么要學(xué)編程圖1. 重復(fù)工作任務(wù)量與時間關(guān)系[1] 如上圖,對于大量重復(fù)工作,非編程者(non-geek)工作量和時間是正相關(guān)的,就像富士康流水線上的工人,這種工作對于高智商的人是無法忍受(富士康招流水線工人會測智商,高智商不會被分配大量重復(fù)工作,容易離職)。而編程者(geek)會分三個階段:手工操作摸索規(guī)律(與non-geek效率相同)、編寫程序(被non-geek遠(yuǎn)遠(yuǎn)甩開)、運行程序(秒殺non-geek)。 生物信息就是這樣一門科學(xué),讓重復(fù)工作遠(yuǎn)離人工重復(fù)勞動。即使非生信人員,學(xué)點編程,在生活中也是非常有樂趣的。 生物信息領(lǐng)域常用語言個人認(rèn)為:是否能熟悉使用Shell(項目流程搭建)+R(數(shù)據(jù)統(tǒng)計與可視化)+Perl/Python等(膠水語言,數(shù)據(jù)格式轉(zhuǎn)換,軟件間銜接)三門語言是一位合格生物信息工程師的標(biāo)準(zhǔn)。 生物信息常用語言非常廣泛,我常用的有Perl, R, Shell,此外參與網(wǎng)頁制作還用過PhP+mySQL,寫公眾號/博客通用Markdown。這些其實都是非常小眾的語言,如果和計算機專業(yè)的人交流,對方可能沒聽過這些語言。本系列“生信人值得擁有的寫作模板”主要以Perl為主,并伴隨一些零星的R和Shell編程的經(jīng)驗和技巧。對于生信Perl使用人員有個交流和互相提高的平臺,讓新人少走點彎路。對于沒有任何Perl基礎(chǔ)強例建議別入坑,直接學(xué)Python教程吧,不解釋看下圖。 TIOBE世界編程語言使用排行 圖2. 2017年10月最新編程語言排名(www.tiobe.com/tiobe-index/) 我們可以看到世界前三是Java, C, C++,大家都聽說過;第五是Python,目前在生領(lǐng)領(lǐng)域有取代Perl地位的趨勢,目前Perl列第12(比去年同期又下降三位)。R語言的數(shù)據(jù)分析領(lǐng)域有應(yīng)用越來越廣泛,今年上升三位至15名;Shell由于版本和各類較多,在50-100名間有4種,此語言只建議快速解決小問題,不建議寫太長的任務(wù),很容易跨平臺不兼容。 總結(jié):
Perl語言簡介Perl,一種功能豐富的計算機程序語言,運行在超過100種計算機平臺上,適用廣泛,從大型機到便攜設(shè)備,從快速原型創(chuàng)建到大規(guī)??蓴U展開發(fā)。 Perl寫作環(huán)境模板推薦很多人三行兩行或直接命令行用perl直接解決問題,雖然快,但是不容重用和別人使用。因此,良好的寫作環(huán)境和模板是效率和專業(yè)的體現(xiàn),即提高自己的代碼重用性,也方便交流和他人使用。 編程環(huán)境IDE推薦使用:Editplus 4.0,網(wǎng)上到處都是注冊機和序列號,隨便用,下載址搜不到好用的。可以后臺回復(fù)“editplus”獲得下載鏈接。此軟件優(yōu)點是可配置模板,可直接編輯服務(wù)器腳本(省略上傳步驟),高效的代碼調(diào)試。 編程模板下面代碼為實現(xiàn)常用功能的寫作模板,如幫助文檔部分(提高代碼重用和版本管理,方便其他人使用),命令行參數(shù)管理(可讀性的命令行是程序的基礎(chǔ)),程序運行時間統(tǒng)計(項目時間管理),常用文件讀取數(shù)據(jù)結(jié)構(gòu)樣式(方便修改文件輸入和輸出)等; 下面是實現(xiàn)這樣功能的模板:可復(fù)制代碼,在editplus中保存為 #!/usr/bin/perl -w
# 加載時間管理,參數(shù)管理,文件名和路徑處理的基礎(chǔ)包,無須安裝
use POSIX qw(strftime);
use Getopt::Std;
use File::Basename;
###############################################################################
#Scripts usage and about.
# 程序的幫助文檔,良好的描述是程序重用和共享的基礎(chǔ),也是程序升級和更新的前提
###############################################################################
sub usage {
die(
qq!
Usage: template.pl -i inpute_file -o output_file -d database -h header num
Function: Template for Perl
Command: -i inpute file name (Must)
-o output file name (Must)
-d database file name
-h header line number, default 0
Author: Liu Yong-Xin, liuyongxin_bio\@163.com, QQ:42789409
Version: v1.0
Update: 2017/10/8
Notes:
\n!
)
}
###############################################################################
#命令行參數(shù)據(jù)的定義和獲取,記錄程序初始時間,設(shè)置參數(shù)默認(rèn)值
#Get the parameter and provide the usage.
###############################################################################
my %opts;
getopts( 'i:o:d:h:', \%opts );
&usage unless ( exists $opts{i} && exists $opts{o} );
my $start_time=time;
print strftime("Start time is %Y-%m-%d %H:%M:%S\n", localtime(time));
print "Input file is $opts{i}\nOutput file is $opts{o}\n";
print "Database file is $optsbv9civq\n" if defined($optspa2zwjq);
# 調(diào)置參數(shù)的初始值,可以添加更多參數(shù)的默認(rèn)值
$opts{h}=1 unless defined($opts{h});
###############################################################################
#讀入的數(shù)據(jù)或注釋文件,用于與輸入文件比較或注釋(可選),提供三種方式
#Read the database in memory(opt)
###############################################################################
#open DATABASE,"<$optsdyrzpli";
# 1. 散列結(jié)構(gòu)數(shù)據(jù)庫,要求數(shù)據(jù)文件有唯一ID并且無順序要求
#my %database; #database in hash
#while (<DATABASE>) {
# chomp;
# my @tmp=split/\t/;
# $database{$tmp[1]}=$tmp[2];
#}
# 2. 數(shù)組結(jié)構(gòu)數(shù)據(jù)庫,無唯一ID,但有順序要求
#my (@tmp1,@tmp2); #database in array
#while (<DATABASE>) {
# chomp;
# my @tmp=split/\t/;
# push @tmp1,$tmp[1];
# push @tmp2,@tmp[2];
#}
#close DATABASE;
# 3. 批量數(shù)據(jù)文件,讀取一批有相似結(jié)構(gòu)的文件
#open a list file
#my %list;
#my @filelist=glob "$opts{i}";
#foreach $file(@filelist){
# open DATABASE,"<$file";
# $file=basename($file);
# while (<DATABASE>) {
# my @tmp=split/\t/;
# $list{$file}{nr}++;
# }
# close DATABASE;
#}
###############################################################################
#Main text.
###############################################################################
# 正文部分,讀取輸入文件,列出輸入和輸入文件的三行作為示例,方便編程處理數(shù)據(jù)
open INPUT,"<$opts{i}";
#chrm0 snppos1 ref2 mat_gtyp3 pat_gtyp4 c_gtyp5 phase6 mat_all7 pat_all8 cA9 cC10 cG11 cT12 winning SymCls SymPval BindingSite cnv
#1 4648 C A C M PHASED C A 0 11 0 0 M Asym 0.0009765625 -1 0.902113
open OUTPUT,">$opts{o}";
#chrm snppos ref mat_gtyp pat_gtyp c_gtyp phase mat_all pat_all cA cC cG cT winning SymCls SymPval BindingSite cnv
#1 4648 C A C M PHASED C A 0 11 0 0 M Asym 0.0009765625 -1 0.902113
my %count;
# h參數(shù)用于去除有文件頭的行
while ($opts{h}>0) { #filter header
$tmp=<INPUT>;
$opts{h}--;
# 可選,輸出文件也保留文件頭
#print OUTPUT $tmp;
}
# 輸入和輸入處理部分,常用按行讀取處理并輸入,默認(rèn)按tab分割數(shù)據(jù)
while (<INPUT>) {
chomp;
my @tmp=split/\t/;
print OUTPUT "$tmp[0]\t$tmp[1]\n";
}
close INPUT;
close OUTPUT;
###############################################################################
#Record the program running time!
# 輸出程序運行時間
###############################################################################
my $duration_time=time-$start_time;
print strftime("End time is %Y-%m-%d %H:%M:%S\n", localtime(time));
print "This compute totally consumed $duration_time s\.\n"; 模板導(dǎo)入Editplus將上述代碼保存為template.pl,在editplus中選擇Tools — Preference — Template — Perl,點擊template.pl右邊的..按鍵,選擇你自己的template.pl即可,以后選擇perl腳本會自己加載該模板。 Reference
|
|