perl -MCPAN -e shell
install Bio::SeqIO
或者直接perl -MCPAN -e 'install Excel::Writer::XLSX'
用cpan裝不上,編譯有問題,嘗試用conda,成功安裝。
conda install -c bioconda perl-bioperl
然后還需要導出perllib,讓perl能找到指定的pm包。
同時學perl、python和shell腳本會很容易將它們的語法搞混,本文主要是一個個人的總結,方便要用時的查詢。
perl基本語法、安裝、幫助文檔
文件頭格式:
#!/usr/bin/perl use strict; use warnings;
運行perl腳本:
#調用perl程序 perl test.pl #可執行腳本 chmod 755 test.pl ./test.pl
基本讀寫:
#鍵盤輸入 $a = <STDIN>; chomp($a); print $a; #文件輸入 open(IN, "<test.txt") or die "Cannot open file:$!\n"; open(OUT, ">test.txt") or die "Cannot open file:$!\n"; while(<IN>){ chomp; print OUT "1. $_"; last; }; close(IN); close(OUT);
基本控制流:
if( ){ }elsif( ){ }else{ }
print "Hello!" if (1 == 1); #簡寫
while( ){ $count++; } for($i; $i <= 10; $i++){ } foreach (@array){ print $_; }
last; #break next; #continue
數據結構:標量變量($),列表(),數組(@),哈希(%),文件句柄(<>)
語法結構:語句以分號(;)結束,代碼塊使用花括號{}划分,動態語言不必指明變量類型
單雙引號:單引號q(),所有原樣輸出;雙引號qq(),允許插入變量
語法慣例:perl中很多地方括號()是可有可無的,特別是內置函數,如print、split等;可以使用遞增遞減運算符
安裝:Windows裝Active版本,(perl -v)檢查;linux裝,
$ tar -zxvf stable.tar.gz -C dir $ sh Configure # 配置 $ make # 安裝 $ make test #測試是否make成功 $ make install
幫助文檔:perldoc命令
perldoc #會提示用法 perldoc perl #會顯示詳細用法 perldoc perlfunc #三大模塊 perldoc perlop perldoc perlfaq
建議使用瀏覽器查看本地的HTML文檔:
查找索引
正則表達式(/ /、$1、=~、!~);模式替換(=~ s/ /);模式匹配規則;修飾符i和全局匹配g;grep函數(搜索數組)
鍵盤輸入(<STDIN>, chomp);
函數(split、length、join、map、grep)
作用域(my、our、local)
perl版本更新與多版本安裝
特殊變量
$_:默認參數,就是當前的默認操作參數,在讀文件<FILE>、迭代for (@array)、split / /、print中非常重要
$!:標准錯誤輸出,一般只與or die語句連用
$1:正則表達式模式中第一個括號內的變量,如(.*)、(string),以此類推
@_:sub函數傳遞的參數數組,
字符串運算符
連接字符串:並置運算符(.)
轉義:反斜杠\
區分標量和字符串:{}顯示指定變量名,如${name}space
重復運算符(x),如“-”x 10
數組、哈希
列表:列表是常量,由圓括號()創建,中間用逗號隔開
# 范圍運算符 @a = (1..10) @b = (1..10, 21..30) @list=(aa..zz);
創建數組:用列表()創建數組
引用數組:用方括號[ ]下標引用數組
創建哈希:用列表()創建哈希,為了好看,鍵值對以=>形式組織;也可以單個創建
引用哈希:用花括號{}引用哈希
數組操作
@name = (1..10); @b = @name[2,4,6]; print "my name is "; print "$#b";
(數值/字符串)比較
數字比較:(==、>、<、>=、<=、!=)
字符串比較:(eq、gt、lt、ge、le、ne)
print用法
print:可以直接接變量$var、@array、%hash,輸出的就是不帶空格回車,將所有元素連在一起,數組一坨,哈希一坨,其中哈希順序是亂的。
print:可以帶雙引號,數組之間有空格,可以分辨了;哈希失效了,沒有內容,就顯示出%hash。
print:輸出到文件時,文件句柄在前,中間是空格(不能是逗號),后面是輸出內容
q()、qq()、qw()、qx{}
q():用單引號將內容括起來
qq():用雙引號將內容括起來
qw():用單引號將空格隔開的序列組裝成數組,會屏蔽里面的標量
# 兩者等價,最好不要有內嵌變量 @a = qw(abc def ghi) @b = ('abc','def','ghi')
qx{ }:捕獲命令輸出
$directory = `dir`; $directory_2 = qx{dir};
正則表達式、模式、替換、匹配規則、grep函數(完)
元字符(簡單元字符、轉義字符、通配符、字符類、分組和選擇、位置通配符)
替換(s/ / /)
修飾符 i 和 全局匹配 g
用於識別輸入流中的特定模式,一般是(/ /),m可以省略,$_是默認匹配對象,指定匹配對象用(=~),$1用於取出第一個括號內匹配
#模式里可以有標量變量 $name = "lizhixin"; $surname = "li"; print "yes, $1" if $name =~ /($surname)/;
模式匹配用途有二:1.條件判斷,用在if語句里;2.取出匹配上的模式,$1,對其進行操作。
- 默認正則表達式是返回真假,可用於條件判斷;
- 如果加入括號(),就可以用$1、$2…訪問相應模式,將()()()等賦值給數組;或者用/ /g賦值給數組,選出所有模式種類
模式匹配規則:
- 從左向右依次匹配
- 找到一個匹配項就返回真
- 盡可能多的尋找能夠匹配的字符(不代表會全部輸出,除非像下面一樣指定,默認是輸出第一個匹配上的)
#//g能夠輸出所有的匹配項 $name = "lizhiixiii"; @result = $name =~ /(i+)/g; print "@result";
# i ii iii
圓點(.):匹配除換行符外的所有單個字符;通常是(*.)連用,匹配所有;(.與其前面的字符無關,可出現在任意位置)
$a="lizhiiiixin"; print "$1" if $a =~ /(i.x)/; # iix
(+):前面的字符要+(1~N次)(不能沒有i,一個i是底線)(必須存在前面的字符)
$a="lizhiiiixin"; print "$1" if $a =~ /(i+x)/; # iiiix
(*):前面的字符要存在0次或多次(可以沒有前面的i)(必須存在前面的字符)
$a="lizhiiiixin"; print "$1\n" if $a =~ /(i*x)/; # iiiix print "$1\n" if $a =~ /(l*i)/; # li
(?):前面的字符進行0次或一次匹配(必須存在前面的字符)
$a="l1zhhiixin"; print "$1\n" if $a =~ /(hi?)/; # h
{n, m} # n:匹配的最小次數;m:匹配的最大次數
/x{5,10}/ #好理解 /x{9,}/ #最少9次 /x{0,4}/ #0次(不出現),最多9次 /x{8}/ #剛好8次
/first.*last/ #可以匹配所有字符,包括所有
匹配方括號內中的任意字符(括號內的通配符^*等會失去原有的意義)
[abcde] #匹配其中任何一個字符 [a-e] #同上[0-9]+ #順序匹配一個或多個數字 [A-Za-z]{5} #匹配任何一組5個字母字符[^A-Z] #不匹配A-Z中的任何單個字符
字符類快捷方式
\w #一個單詞字符,同[a-zA-Z0-9_] \W #與\w相反 \d #一個數字,與[0-9]相同 \D #與\d相反 \s #一個白空間字符,同[\t\f\r\n] \S #與\s相反
# 使用字符類快捷方式\d\w+等 $name = "li12345 zhi xin"; print "$1\n" if $name =~ /(\d{5})/; print "$1\n" if $name =~ /(\s\w+\s)/;
分組和選擇(找任意一種模式,或)
print "yes\n" if (/dogs|cats/); print "yes\n" if (/(fr|b|fl|cl)og/); ($one, $two) = /(.*)\sis\s(.*)/;
位置通配符
/^Help/ #只匹配Help開頭的行 /^one.*two$/ #只匹配one開頭和two結尾的行 /^only$/ #只匹配包含only的行 /^$/ #匹配空行 /^/ #匹配非空行
#不匹配 if($a !~ /zi/){ print "not match.\n"; }
print "yes\n" if(m/Piglet/); # 如果使用的是斜杠//,那么m可以省略
$_="apple is red"; ($fruit, $color) = /(.*)\sis\s(.*)/;
正則匹配可能會有多種可能的匹配位點,但有時只返回一種最合適的匹配結果,請問這個結果是如何選出來的?(核心問題)
$a = "one fish, two frog, red fred, blue foul"; @F = $a =~ /(f\w\w\w)/g;
替換(返回匹配的數量)
$a = "lizhizhixin"; print "$a\n"; $a =~ s/zhi/xin/; #只替換第一個匹配到的模式 print "$a\n";
修飾符(/ /i)與多次匹配(/ /g)
$name = "LiZhixin"; print "yes, $1" if $name =~ /(^li)/i; # yes, Li
$seq = "ATCTGCAATTTCCTA"; $numA = 0; while ($seq =~ /T/g){ $numA++; } print "$numA\n";
grep函數(搜索數組,返回匹配元素或者修改匹配元素,條件可以使正則表達式或是其他條件)
@name = qw(li zhi xin); @result = grep(/^[^l]/, @name); print "@result"; # zhi xin
@result = grep(s/i/o/, @name); print "@result"; # lo zho xon
@result = grep(length($_)>2, @name); print "@result"; # zhi xin
函數
標准函數格式:
常用內置函數
split
int(5.20);
length(“nose”);
lc(“ME TOO”);
uc(“hal 9000”);
cos(50);
rand(5)
堆棧操作函數
push()
pop()
shift():將最后一個元素移走,常用語處理函數參數
unshift()
命令行
上下文
chomp
chomp是運算符,可以用圓括號,也可以用空格;它會改變參數變量,其返回值是1或0
$a = "lizhiixn\n"; print $a; print "next\n"; chomp $a; print $a; print "next";
$b = chomp($a); #極少這么用
perl版本更新與多版本安裝
自己做服務器最好用Ubuntu,apt-get用着很方便,版本更新可以用系統自帶的軟件更新
Linux沒有注冊表,軟件安裝相對獨立,理論上所有軟件都是綠色版,只是稍微需要配置環境變量和軟鏈接
或者安裝多個版本,然後修改/usr/bin/perl的symbolic link到/usr/local/bin/perl,軟連接的指向問題
tar zxvf perl-5.10.0.tar.gz cd perl-5.10.0 ./Configure -des -Dprefix=/usr/local/perl # 參數-Dprefix指定安裝目錄為/usr/local/perl make make test make install
mv /usr/bin/perl/ usr/bin/perl.bak # 替換系統原有的perl ln -s /usr/local/perl/bin/perl/ usr/bin/perl perl –v perl -MCPAN-e shell # 安裝一些其它perl模塊 #第一次執行的話,會提示安裝cpan並要求連接網絡下載最新的模塊列表.然后就可以安裝東西了 cpan> install DBI