获得的新知识点
取模(取余数):%
乘幂:**
字符串必须使用“”或‘’(‘’号内的转义符失效)
连接符:.
重复符:x,例如5x3结果为“555”
变量赋值
=表示赋值。
==表示等于,判断语句中常出现。
+=表示双目操作符,用于少些一个变量,例如$a=$a+1等效于a.=1(但是此常用于字符串的连接中)。
操作符号优先级(从上至下一次递减):
比较操作符:
特殊的标量:$_(perl中未指明变量时,默认为此变量)
回车和换行符:
linux系统下换行:\n
mac系统下回车:\r
window西欧统下回车加换行符:\r\n
chomp():去除行为换行符,如果没有则不起作用
chop:去除结尾的一个字符,每次运行都会去除行末的一个字符
数组和列表
@array=[1,2,3,4,5];
#perl中数组角标从0开始,这点与其他语言不同,其他都相同
$array[0]=1;
$array[4]=5;
#数组中最后一个元素角标
$#array;
#数组元素个数统计
$#array+1;
构建数组和列表
#".."表示范围操作符,每次加1
#定义数组使用@符号
@number=(1..100);
print "@number\n";
#qw操作符,可以省略逗号
@strings=qw (abs is arrbre of alarm boo strick);
#split和join函数
@abc="ab:de:g:h";
#使用split将数组以:进行分割
@array = split /:/,$abc,4;
print "@array\n";
#join相当于胶水,将数组@array中的字符以TAB连接成新的数组
$new_abc=join "\t',@array;
数组的操作函数
@abc=(1..5);
#pop函数会弹出数组中最后一个元素弹出
$value=pop @abc;
#在数组中添加一个元素
push @abc,5;
#shift表示去除首个元素
$value_2=shift @abc
#unshift表示将某个元素添加到首个元素
unshift @abc,1;
#sort表示排序
@number_sort=sort (@abc);
#reverse表示反向排序,既可以操作数组,也可以操作变量
@number_re_sort=reverse sort (@abc);
#####遍历数组
foreach $num (@abc) {
print "$num\n";
}
perl帮助文档
perldoc -h #用于查看perl的帮助文档,也可以直接到官网(perl.org)查看或下载相应的文档。
数据的输入和输出
#IN或OU,文件句柄;文件名用双引号括住
open IN,"<gene.ffn";
open OU,">protein.fea";
cds2pep.pl #该脚本包含程序$0,并读取命令行的三个参数
#运行改脚本的命令行如下:
perl cds2pop.pl 参数1(输入文件) 参数2(输出文件) 参数3(转换文件)
#######程序错误提示命令
-w
use warning
die 该命令会在出错时终止命令,上述两个则只会提出出错位置,而不会停止命令
#读取文件数据并将期输出到指定文件的的脚本
open IN,"<$ARGV[0]";
open OU,">$ARGV[1]";
$/=">"; #使用>作为分隔符
while (<IN>) {
print OU "$_\t";
}
close IN;
close OU;
解压gz文件格式转换(fq2fa)程序
#!/usr/bin/perl -w
open IN,"zcat $ARGV[0] |";
open OU,$ARGV[1]";
while ($id=<IN>) {
chomp ($id);
chomp($seq=<IN>);
<IN>;
<IN>; #已经将4行转换为2行
$id=~ tr /@/>/;
print OU "$id\n";
print OU "$seq\n";
}
close IN;
close OU;
哈希
相比于数组(以唯一的角标进行数据的读取)的优势,可以直接以唯一的字符串对文件进行检索
哈希变量使用%
%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函数
@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;
子程序(自定义函数)及其调用
use strict #编译中使用严格的标准,使用的情况,当代码量超过1个页面时。
sub sum {
@_
my $sum1=shift @;
my $sum2=shft @; #程序块
my $total=$sum1+$sum2;
return $total;
}
my $total=&sum (3,2);
&程序名 #调用
例子:使用子程序计算fasta文件中的基因数目和平均序列长度,子程序如下:
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;
}