獲得的新知識點
取模(取余數(shù)):%
乘冪:**
字符串必須使用“”或‘’(‘’號內(nèi)的轉(zhuǎn)義符失效)
連接符:.
重復(fù)符:x吻贿,例如5x3結(jié)果為“555”
變量賦值
=表示賦值。
==表示等于,判斷語句中常出現(xiàn)窝稿。
+=表示雙目操作符祝闻,用于少些一個變量奕谭,例如$a=$a+1等效于a.=1(但是此常用于字符串的連接中)仪缸。
操作符號優(yōu)先級(從上至下一次遞減):
比較操作符:
特殊的標量:$_(perl中未指明變量時贵涵,默認為此變量)
回車和換行符:
linux系統(tǒng)下?lián)Q行:\n
mac系統(tǒng)下回車:\r
window西歐統(tǒng)下回車加換行符:\r\n
chomp():去除行為換行符,如果沒有則不起作用
chop:去除結(jié)尾的一個字符,每次運行都會去除行末的一個字符
數(shù)組和列表
@array=[1,2,3,4,5];
#perl中數(shù)組角標從0開始独悴,這點與其他語言不同,其他都相同
$array[0]=1;
$array[4]=5;
#數(shù)組中最后一個元素角標
$#array;
#數(shù)組元素個數(shù)統(tǒng)計
$#array+1锣尉;
構(gòu)建數(shù)組和列表
#".."表示范圍操作符刻炒,每次加1
#定義數(shù)組使用@符號
@number=(1..100);
print "@number\n";
#qw操作符,可以省略逗號
@strings=qw (abs is arrbre of alarm boo strick);
#split和join函數(shù)
@abc="ab:de:g:h";
#使用split將數(shù)組以:進行分割
@array = split /:/,$abc,4;
print "@array\n";
#join相當(dāng)于膠水自沧,將數(shù)組@array中的字符以TAB連接成新的數(shù)組
$new_abc=join "\t',@array;
數(shù)組的操作函數(shù)
@abc=(1..5);
#pop函數(shù)會彈出數(shù)組中最后一個元素彈出
$value=pop @abc坟奥;
#在數(shù)組中添加一個元素
push @abc,5;
#shift表示去除首個元素
$value_2=shift @abc
#unshift表示將某個元素添加到首個元素
unshift @abc,1;
#sort表示排序
@number_sort=sort (@abc);
#reverse表示反向排序,既可以操作數(shù)組拇厢,也可以操作變量
@number_re_sort=reverse sort (@abc);
#####遍歷數(shù)組
foreach $num (@abc) {
print "$num\n";
}
perl幫助文檔
perldoc -h #用于查看perl的幫助文檔爱谁,也可以直接到官網(wǎng)(perl.org)查看或下載相應(yīng)的文檔。
數(shù)據(jù)的輸入和輸出
#IN或OU孝偎,文件句柄访敌;文件名用雙引號括住
open IN,"<gene.ffn";
open OU,">protein.fea";
cds2pep.pl #該腳本包含程序$0,并讀取命令行的三個參數(shù)
#運行改腳本的命令行如下:
perl cds2pop.pl 參數(shù)1(輸入文件) 參數(shù)2(輸出文件) 參數(shù)3(轉(zhuǎn)換文件)
#######程序錯誤提示命令
-w
use warning
die 該命令會在出錯時終止命令衣盾,上述兩個則只會提出出錯位置寺旺,而不會停止命令
#讀取文件數(shù)據(jù)并將期輸出到指定文件的的腳本
open IN,"<$ARGV[0]";
open OU,">$ARGV[1]";
$/=">"; #使用>作為分隔符
while (<IN>) {
print OU "$_\t";
}
close IN;
close OU;
解壓gz文件格式轉(zhuǎn)換(fq2fa)程序
#!/usr/bin/perl -w
open IN,"zcat $ARGV[0] |";
open OU,$ARGV[1]";
while ($id=<IN>) {
chomp ($id);
chomp($seq=<IN>);
<IN>;
<IN>; #已經(jīng)將4行轉(zhuǎn)換為2行
$id=~ tr /@/>/;
print OU "$id\n";
print OU "$seq\n";
}
close IN;
close OU;
哈希
相比于數(shù)組(以唯一的角標進行數(shù)據(jù)的讀仁凭觥)的優(yōu)勢阻塑,可以直接以唯一的字符串對文件進行檢索
哈希變量使用%
%abc=("a",1,"b",2,"c",3); #健(a)對值(1)
%abc=(
"a"=>1,
"b"=>2,
"c"=>3,
);
use Data::Dumper #用于打印的模塊
%hash=(); #清空哈希的方法:定義一個新哈希
例子:
open IN,"$ARGV[0]";
while (<IN>) {
chomp;
@line=split /\s+/,$;
$hash($line[0])=$line[1];
}
close IN;
print Dumper (%hash);
#其他hash函數(shù)
@key=keys %hash;
@value=values %hash;
print "@key\n";
print "@values\n";
@temp = sort keys %hash
#返回hash鍵對值的while方法
foreach (@temp) {
print "$\n";
print "$hash{$_}\n";
}
#刪除hash中的某個元素
delete $hash(元素名);
序列提取
use strict;
use Data::Dumperl;
if (scalar @ARGV==0) {
die "Usage: This program is used to get gene sequence by a list
perl $0 <id list> <fasta file>\n";
my %hash=();
open IN,"$ARGV[0]";
while (<IN>) {
chomp;
$hash=($)=1; #給鍵值賦為1
}
close IN;
open FA,"<$ARGV[1]";
$/=">";<FA>;
while (<FA>) {
chomp;
my $id=(split /\n/,$,2);
if (exists $hash{$id}) {
print "$_";
} else {
next;
}
print "$id\n";
}
close FA;
子程序(自定義函數(shù))及其調(diào)用
use strict #編譯中使用嚴格的標準果复,使用的情況陈莽,當(dāng)代碼量超過1個頁面時。
sub sum {
@_
my $sum1=shift @;
my $sum2=shft @; #程序塊
my $total=$sum1+$sum2;
return $total;
}
my $total=&sum (3,2);
&程序名 #調(diào)用
例子:使用子程序計算fasta文件中的基因數(shù)目和平均序列長度虽抄,子程序如下:
use strict;
open IN,"<$ARGV[0]";
while (<IN>) {
chomp;
my ($id,$file) =(split /=/,$_)[0,1];
my ($gene_num,$gene_length)=&gnen_stat ($file);
}
colse IN;
sub gene_stat {
my $file=shift @_;
my $gene_num=0;
my $genelength=0;
open FA, "$file";
while (<FA>) {
chomp;
if (/^>/) {
$genenum+=1;
} else {
my $len=length ($_);
}
}
close FA;
my $avg_length=$genelength/$genenum;
return $genenum, $avg_length;
}