perl 語法速查 | 模塊安裝


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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM