志在指尖
用双手敲打未来

perl教程(基础入门篇)

perl教程

Perl是高端、通用、解说型、动态的编程言语宗族。最初设计者拉里·沃尔为了让在UNIX上进行报表处理的工作变得更便利,决定开发一个通用的脚本言语,而在1987年12月18日发表。当前,Perl言语宗族包含两个分支Perl5以及Perl6(开发中)。虽然Perl不是正式的首字母缩略词,但仍有各种各样的逆向首字母缩略词,包含“有用的提取和陈述言语”。
Perl借用了C、sed、awk、shell脚本以及许多其他编程言语的特性。其中最重要的特性是Perl内部集成了正则表达式的功能,以及巨大的第三方代码库CPAN。
2000年开端,当前拉里·沃尔开端开发Perl6,来作为Perl的后继;不过,Perl6言语的语法有许多改变,所以Perl6被视为Perl宗族中的另一个言语。
Perl言语的应用范围很广,除CGI以外,Perl被用于图形编程、系统管理、网络编程、金融、生物以及其他范畴。由于其灵敏性,Perl被称为脚本言语中的瑞士军刀。
提示:假如你学习过PHP,ASP等其他编程言语,将有助于你更快的了解Perl编程。
下面让我们感受下第一个Perl程序吧!
Perl的HelloWorld程序
下面是一个在标准输出设备上输出HelloWorld的简单程序,这种程序通常作为开端学习编程言语的第一个示例:
实例
#!/usr/bin/envperl
print”Hello,world!\n”;
运转实例?
点击”运转实例”按钮检查在线实例
假如有perl5.10以上的版本,也能够这样:
实例
#!/usr/bin/envperl
use5.010;
say”Hello,world!”;
运转实例?
点击”运转实例”按钮检查在线实例
这个程序将输出一行字符串:“Hello,world!”,以及一个换行。
提示:我们的perl教程将帮助您学习从初级到高档的perl知识。假如你有任何疑问,请前往PHP中文网perl社区提出你的问题,会有热心网友为你解答。
Perl优缺点
优点
为了完成这样的目标,并且又由于LarryWall自己也是一个言语学家,他设计Perl言语时运用了许多言语学的思想。相比C、Pascal这样的“高档”言语而言,Perl言语直接供给泛型变量、动态数组、Hash表等愈加便捷的编程元素。Perl具有动态言语的强壮灵敏的特性,并且还从C/C++、Basic、Pascal等言语中别离学习了语法规矩,然后供给了许多冗余语法。
使得程序员能够疏忽计算机内部数据存储、类型、处理方法、运算规矩、乃至内存越界等等的细节,而将思考中心放在所需要的程序逻辑上。就这一点而言,许多Perl程序员以为当前只要Perl、Python等泛型言语才能称为“高档”言语,而C、Pascal乃至C++这些只能称为“中高档”言语而已。能够说,在一致变量类型和掩盖运算细节方面,Perl做得比Python更为超卓。
由于从其他言语大量学习了语法,使得从其他编程言语转到Perl言语的程序员能够敏捷上手写程序并完成任务,这使得Perl言语是一门容易用的言语。
缺点
也正是由于Perl的灵敏性和“过度”的冗余语法,也因而获得了仅写(write-only)的“美誉”,由于Perl程序能够写得很随意(例如,变量不经声明就能够直接运用),但是或许少写一些字母就会得到意想不到的结果(而不报错),许多Perl程序的代码令人难以阅览,完成相同功能的程序代码长度能够相差十倍百倍,这就令程序的维护者(乃至是编写者)难以维护。
相同的,由于Perl这样随意的特点,或许会导致一些Perl程序员忘记语法,以至于不得不经常检查Perl手册。对此,《LearningPerl》一书里主张经常运用Perl编程。
主张的解决方法是在程序里运用usestrict;以及usewarnings;,并一致代码风格,运用库,而不是自己运用“硬编码”。Perl相同能够将代码书写得像Python或Ruby等言语相同优雅。

perl

perl教程基础入门篇

一、Perl的环境准备
Linux/Unix:大多数内置一些软件也内置perl,
Windows:ActivePerl5.10.0Perl的东西
二、修正东西:
notepad++、ultraedit,(我用的pycharm,装置个perl插件感觉也蛮好用)
三、变量
不像C语言相同,perl无需指定数据类型。
1、perl的四种变量
Scalar:标量,以$开端,后边以字母或_开头,再后边可所以字母或数字;
array:数组,列表,以@最初;
Hash:哈希,散列,以%最初文件:
2、变量特征
大写字母区分大小写:$Var,$VAR,$var
内置变量:$/,$@、@ARGV、$_等
3、字符串变量
由双引号或单引号标识的一组字符组成;最少0个字符(“”为空串),最多能够占满内存,
“${str}ing”=$str+ing”!=$string
记住一些常用的转义字符像\.。加上\则$var不是体系内置变量了。
print“the\$varis$var.”
留意单引号的用法:不替换、不转义
$var=”str”;
print“thisis$var”;#”thisisstr”赋值的变量的内容
print‘thisis$var’;#‘thisis$var’体系内置变量
4、变量初值
未创立时状态为undef,到达文件尾也为undef。
5、函数
length():字符串长度
uc,lc,ucfirst,lcfirst:改动大小写函数
substr,index,pos:字符串函数
pos
调用语法offset=pos(string);
回来最终一次方式匹配的方位
index
sayindex$str,”e”,3;#18
sayrindex$str,”e”,37;#33
sin等三角函数
rand(),srand():随机发生函
chop函数:$lastchar=chop($str)#截去最终一个字符
chomp函数:$result=chomp($str)#截去结束的行分隔符(一般为”\n”),行分隔符由$/界说
die函数:在操控台标准过错输出信息后退出程序。
warn:输出信息后不退出程序,只起警报作用。
$!:内部变量,包括过错代码。
$@:内部变量,包括过错信息。
6、操控结构
if(condition1){}elsif(condition2){}else{}}
unless(){}
until(){}
do{}until()
while(){}
do{}while()
for(;;){}
foreach循环语句
示例:
foreach$a(@a){statement;}#用于循环数组,每一行存储到$a中
foreach$a(1,2,3,4){}用于列表
foreach$k(keys%h){}用于哈希/散列
foreach$a(@a[1,2,4]){}仅对数组部分元素
foreach(@a){}缺省循环变量为$_
7、循环操控
last:退出循环
next:进入下一循环
redo:从头执行本次循环
goto:跳转
8、列表——数组的方式
方式:(1,”a”,2.3,$a,$x+1),其元素可所以数字、字符串、变量、表达式;
空列表(),单元素列表(2)不同于标量2;
qw(1$astr):()能够用其他符号表明,如<>元素可所以数值、变量、不带引号的字符串,中心用空格分隔
9、数组——列表的存储
@a=(1,2,3),不同于$a,初始值为();
元素方式:$a[0]表明榜首个元素,索引从0开端,$a[‐1]表明倒数榜首个元素;
数组的赋值:@a=(1,2,3,4);@b=@a;@b=(2,3);@a=(1,@a,4);
@a=<>;#从屏幕输入进行赋值,按下CTRL‐d完毕;
改动元素的值:$a[1]=3;
超出数组大小的元素赋值:$a[5]=6;#自动增加,其他元素为NULL;
10、数组的读出
@a=(1,2,3);
$a=$a[1];
($x,$y,$z)=@a;=>$x=1,$y=2,$z=3;
($x,$y)=@a;=>$x=1,$y=2;
($a,$b,$c,$d)=@a;=>$a=1,$b=2,$c=3,$d=“”;
$a=@a=$#a+1;#$a为数组长度,$#a为数组的最终一个元素的索引
($a)=@a;#数组的榜首个元素$a[0]
打印数组:print@a;#元素直接相连;
print“@a”;#元素之间用空格分隔
11、数组片段
@a=(1..5)
@sub=@a[0,1,3];
@a[1,3]=(“a”,”b”);
@b=(1,2,3);
@sub=@a[@b];
@a[1,2]=@a[2,1];
@a[1,2,3]=@a[3,2,4];
12、数组操作函数
sort:$a,$b(体系内置变量自定尽量防止运用)表明数组元素;@b=sort{$a<=>$b}@a为对一维数组排序;@b=sort{$a->[0]<=>$b->[0]}@a为对二维数组排序;@b=sort{$a->[0]<=>$b->[0]or$a->[3]<=>$b->[3]}@a##先依照榜首列再依照第4列排序;以上均为对数字依照从小到大排序,若依照从大到小则$a与$b方位反过来;对字符排序运用cmp替代<=>;
reverse@a;#取数组的逆序
chop@a;#每个元素截去最终一个字符
shift(@a);#删去数组榜首个元素并回来该值,缺省对@ARGV数组
unshift(@a);#在数组头部增加元素,回来新数组长度
push(@a,$a);#在数组结束增加元素
pop(@a);#删去数组结束元素
join(衔接符号,@a)把数组衔接为一个字串@a=(‘a’,‘b’);join(‘:’,?@a)=“a:b”;
split(/分隔符/,切割串,长度)分隔符缺省为空格,可省掉;切割串缺省为$_,可省掉;长度:可省掉;缺省为悉数切割。
$s=“a,b,c”;
@a=split(/,/,$s);#即@a=(‘a’,’b’,’c’);
@a=split(/,/,$s,2);#即@a=(‘a’,’b’,’c’);
splice函数:@ret=splice(@a,skip,length,@newlist);
对数组@a进行操作,跳过skip个元素,然后用@newlist替换length个元素@newlist长度能够不为length,但其替换长度总为length假如length=0表明为插入;假如@newlist=()则表明为删去当length和@newlist都省掉时表明悉数删去。
@found=grep(/pattern/,@search)对数组@search的每个元素进行查找匹配pattern,匹配元素回来到@found。
map(expr,@list)对数组@list的每个元素进行expr运算,回来运算后的数组。元素用$_替代,如map($_+1,(1,2))(2,3)
13、二维数组
@aoa=[[1,2,3],[‘a’,’b’,’c’]];该数组的元素为两个数组
子数组拜访:$aoa[0][0]=1、$aoa[1][2]=”c”;
14、相关数组:哈希/散列
相关数组的表明:%hash=(1,’a’,2,’b’);
相关数组的下标为关键字key,由key得到的值为value
上式的意义是%hash=(1=>‘a’,2=>’b’);
元素方式$hash{1}=‘a’
15、相关数组的赋值
%a=(“key1”,1,”key2”,2);
$a{“liu”}=”wang”;
$a{“you”}=”we”;
16、相关数组操作函数
keys(%hash),values(%hash)别离回来键和值的列表,回来元素无次第
($key,$value)=each(%hash)效率高于先用foreach$k(keys%h),再用$hash{$k}
exists$hash{‘key’}判别关键字是否存在undef(%h)相当于删去散列%h=();
delete:删去键$a{“you”}
17、相关数组的次第
foreach$w(sortkeys(%hash))#依照字符串排序
foreach$w(sort{$a<=>$b}keys(%hash))#数值排序
四、文件
存放于磁盘,用于读写拜访,拜访前必须先翻开文件,完毕时封闭文件。
1、基本写法:
open(HANDLE,“>filename”)||die$!;
成功回来非零,失利回来零
HANDLE:文件句柄,用来代表操作的文件。以字母最初,字母、数字、下划线组成,一般用大写字母缺省翻开的句柄STDIN,STDOUT,STDERR,文件描述符为0,1,2。不用调用open就能够直接拜访。
STDIN:键盘输入,操控台。
STDOUT:屏幕,显示屏。
STDERR:过错输出,显示屏。
2、文件拜访方式
只读:open(F,“
只写:open(F,“>filename”);文件不存在则创立新文件,存在则清空重写
追加:open(F,“>>filename”);在存在的文件后边追加内容
读写:open(F,“+
读写:+>,文件不存在则创立,存在则清空再写
读写:+>>,文件不存在则创立,存在则追加
3、翻开:open,sysopen;封闭close
读<>,readline写print定位tell,seek
读文件$line=读一行到line,指针后移一行。缺省读到$_中。
$/=‘\n’,为行分隔符,遇到它则为一行完毕,行包括$/。可用chomp($s)去除此标志,行尾不含$/则不去除字符。可设置$/为其他字符串,遇到$/为行完毕,chomp去除此字符串。
@array=文件内容悉数读出,每行为一个元素。含回车。当从STDIN中读时,可省掉为<>。
@ARGV:大局,$ARGV[0]是榜首个参数,不是程序名。<>是对$ARGV的引证。@ARGV一旦赋值,原值丢掉。榜首次看到<>时,翻开以$ARGV[0]中的文件。无参数则翻开STDIN读。所以能够省掉。shift(@ARGV),元素数量削减一个;<>读翻开的文件中的一切行;再读第二个参数表明的文件。文件尾检测:eof和eof()。文件完毕回来真。
printf(“formatstr”,$a,$b…)格局化串包括%m.nf的格局指示,后边依次是相应的值列表。
4、测验
if(‐e“file1”){printSTDERR(“file1\n”);}文件是否存在。
‐b是否为块设备
‐c是否为字符设备
‐d是否为目录
‐e是否存在
‐f是否为一般文件
‐l是否为符号链接
‐o是否具有该文件
‐r是否可读
‐s是否非空
‐t是否表明终端
-w是否可写
‐x是否可执行
‐z是否为空文件
‐A距前次拜访多长时间
‐B是否为二进制文件
‐M距前次修正多长时间
‐O是否只为“真实的用户”所具有
‐R是否只要“真实的用户”可读
‐T是否为文本文件
‐W是否只要“真实的用户”可写
‐X是否只要“真实的用户”可执行
‐s回来文件长度,‐A‐M回来天数。
五、正则表达式(方式匹配)
在字符串中寻找特定序列的字符。指定方式:由斜线包括,/def/即方式def。
匹配操作符=~、!~
查验匹配是否成功=~字符串是否匹配方式,匹配则为真,没有匹配则为假。
!~不匹配为真,匹配为假。
$question=“expleaseding”$question=~/please/
$question!~/edit/
1、正则表达式的运用
用于条件判别:
if($question=~/please/){
print(“Thankyouforbeingpolite!\n”);
}else{
print(“Thatwasnotverypolite!\n”);
}
grep:正则表达式只对简略变量匹配,假如是数组@a=~/abc/,则’2’=~/abc/。用grep(/abc/,@a);对数组中的每个元素匹配。
split(/abc/,$line)依据方式匹配切割字符串。方式匹配的3种类型:m//方式匹配,s///匹配并替换,tr///逐个替换,翻译方式匹配之一:
2、元字符+一个或多个相同的前导字符(方式)。如:/de+f/指def、deef、deeeeef等。是对前一个匹配方式的重复,不是匹配后的字符的重复。如/d[eE]+/,匹配de,dee,dE,dEE,deE,dEe。不是匹配了e后再重复eee,就没有eE了。相当于/d[eE][eE][eE]…/。
3、*匹配0个、1个或多个相同字符;?:匹配0个或1个该前一个字符.
4、”.”匹配除换行外的一切单个字符,一般与*合用.*一切恣意数量字符。与前一字符结合,可不呈现字符。相当于….匹配指定数目的字符
5.{}指定所匹配字符的呈现次数。如:/de{1,3}f/匹配def,deef和deeef;/de{3}f/匹配deeef;/de{3,}f/匹配不少于3个e在d和f之间;/de{0,3}f/匹配不多于3个e在d和f之间。
6、挑选[]:匹配一组字符中的任一个。/a[0123456789]c/将匹配a加一个数字加c的字符串。与+联合运用例:/d[eE]+f/匹配def、dEf、deef、dEdf。
7、[^]表明除其之外的一切字符,如:/d[^deE]f/匹配d加非d,e,E字符加f的字符串
8、[0‐9][a‐z][A‐Z]/a[0‐9]c/匹配恣意字母或数字
9、字符”|”指定两个或多个挑选来匹配方式。每个挑选都是一个匹配或一组。不是单个字符。/def|ghi/匹配def或ghi。/x|y+/匹配x或y+。
例:查验数字表明合法性
if($number=~/^‐\d+$|^‐0[xX][\da‐fa‐F]+$/){
print(“$numberisalegalinteger.\n”);
}else{
print(“$numberisnotalegalinteger.\n”);
}
其间^‐\d+$匹配十进制数字,^‐0[xX][\da‐fa‐F]+$匹配十六进制数字。
10、转义符
方式中包括一般被看作特别意义的字符,须在其前加斜线”\”。如:/\*+/中\*即表明字符*,而不是上面提到的一个或多个字符的意义。斜线的表明为/\\/。
在PERL5中可用字符对\Q和\E来转义。从\Q开端到\E间的字符为原始字符,无特别意义。
\d恣意数字[0‐9]
\D除数字外的恣意字符[^0‐9]
\w恣意单词字符
\W恣意非单词字符
\s空白[\r\t\n\f]
\S非空白[^\r\t\n\f]
例:/[\da‐z]/匹配恣意数字或小写字母。
11、定界:
^或\A仅匹配字符串首
$或\Z仅匹配字符串尾
\b匹配单词鸿沟
\B单词内部匹配
/^def/只匹配行以def打头的字符串,/def$/只匹配以def结束的字符串,结合起来的/^def$/只匹配字符串def
^$和\A,\Z在多行匹配时用法不同。
示例
例1:查验变量名的类型:
if($varname=~/^\$[A‐Za‐z][_0‐9a‐zA‐Z]*$/){
print(“$varnameisalegalscalarvariable\n”);
}elsif($varname=~/^@[A‐Za‐z][_0‐9a‐zA‐Z]*$/){
print(“$varnameisalegalarrayvariable\n”);
}elsif($varname=~/^[A‐Za‐z][_0‐9a‐zA‐Z]*$/){
print(“$varnameisalegalfilevariable\n”);
}else{print(“Idon’tunderstandwhat$varnameis.\n”);
}
例2:\b在单词鸿沟匹配:/\bdef/匹配def和defghi等以def打头的单词,但不匹配abcdef。/def\b/匹配def和abcdef等以def结束的单词,但不匹配defghi,/\bdef\b/只匹配字符串def。留意:/\bdef/可匹配$defghi,因为单词包括字母数字下划线,$并不被看作是单词的部分。
例3:\B在单词内部匹配:/\Bdef/匹配abcdef等,但不匹配def;/def\B/匹配defghi等;/\Bdef\B/匹配cdefg、abcdefghi等,但不匹配def,defghi,abcdef。
12、方式的重用
当方式中匹配相同的部分呈现屡次时,可用括号括起来,用\n来屡次引证,以简化表达式。把匹配的值存起来以后再用,和+方式的重复不同。只在本次匹配可用。还能够在匹配外引证。
例:/\d{2}([\W])\d{2}\1\d{2}/匹配12‐05‐92,26.11.87,070492等但不匹配12‐05.92留意:/\d{2}([\W])\d{2}\1\d{2}/不同于/(\d{2})([\W])\1\2\1/,后者只匹配形如17‐17‐17的字符串,而不匹配17‐05‐91等。
13.方式变量
在方式匹配后调用重用部分的成果可用变量$n;
悉数的成果,匹配方式用变量$&,包括不在括号中的;
匹配处之前的部分用变量$`,匹配处之前的部分用变量$’。也可用列表一次获得。
$string=”Thisstringcontainsthenumber25.11.”;
$string=~/(\d+)\.(\d+)/;#匹配成果为25.11
$integerpart=$1;#now$integerpart=25
$decimalpart=$2;#now$decimalpart=11
$totalpart=$&;#nowtotalpart=25.11
$_=”Thisstringcontainsthenumber25.11.”;
@result?=~/.?(\d+)\.(\d+)/;匹配得到的变量构成列表,可赋值给数。当匹配失利,$1的内容不确定,可能是从前匹配的内容。为防止匹配失利要进行是否匹配成功的判别,或直接赋值,
($m1,$m2)=($name=~/(ab).*(c))把()内的匹配值直接赋与$m1,$m2,不改动$1的值。
嵌套运用:/((aaa)*)/,最外层的括号为$1,内层为$2,$3。
匹配选项g匹配一切可能的方式,依据懒散规矩不加g只匹配一处。回来到数组中。@matches=”balata”=~/.a/g;#@matches=(“ba”,”la”,”ta”)匹配的循环:
每次匹配记住前次的方位:
while(“balata”=~/.a/g){
$match=$&;
print(“$match\n”);
}
成果为:balata
当要匹配的字符串改动时从头开端查找。
14、匹配选项g,
可用函数pos来操控下次匹配的偏移:
$offset=pos($string);
下一个匹配开端的方位pos($string)=$newoffset;
从此方位开端查找匹配
15、匹配选项i
疏忽方式中的大小写:/de/i匹配de,dE,De和DE。
m将待匹配串视为多行,
^符号匹配字符串的开始或新的一行的开始;
$符号匹配任意行的结束。
以下例只匹配榜首行为a,否则无匹配;
$line=’abc’;
$line=~/^(.*)$/m;
16、匹配选项s
将待匹配串视为单行,.能够匹配\n。
/a.*bc/s匹配字符串axxxxx\nxxxxbc,但/a.*bc/则不匹配该字符串。
17、匹配选项x
疏忽方式中的空白。格局清晰/\d{2}([\W])\d{2}\1\d{2}/x等价于/\d{2}([\W])\d{2}\1\d{2}/。
18、匹配符号的优先级
象操作符相同,转义和特定字符也有执行次第
()方式内存
+?*{}呈现次数
^$\b\B锚
|选项
19、扩展匹配方式
1)取消贪婪:运用?
“a12b38b”
/a.*b/悉数匹配
当/a(.*?)b/时匹配a12b。
2)/pattern(?=string)/
必定的和否定的预见匹配.?=?!匹配后边为string的方式,
相反的,(?!string)匹配后边非string的方式,如:$string?=?”25abc8″;$string?=~?/abc(?=[0‐9])/;$matched?=?$&;?#?$&为已匹配的方式,为abc,不是abc8
例1。$line=“block1firstblock2secondblock3third”
$line=~/block\d(.*?)(?=block\d|$)/g;
print$1;
例2。运用while
$line=”beginbeginbegin”;
while($line=~/begin(.*?)(?=begin|$)/sg){
push(@blocks,$1);
}
3)替换操作
s/pattern/replace/,将字符串中与pattern匹配的部分换成replace。
替代字符串不是方式。如
$string=”abc123def”;
$string=~s/123/456/;#now$string=”abc456def”;
在替换部分可运用方式变量$n(如$1,$2…),如
s/(\d+)/[$1]/,但在替换部分不支持方式的特别字符,如{},*,+等,如s/abc/[def]/将把abc替换为[def]。
替换操作符的选项:
g,i,m,o,s,x,ee替换字符串作为表达式。
e选项把替换部分的字符串看作表达式,在替换之前先核算其值,如:
$string=”0abc1″;
$string=~s/[a‐zA‐Z]+/$&x2/e;#now$string=”0abcabc1″
20、翻译操作
tr/string1/string2/。string1中的榜首个字符替换为string2中的榜首个字符,把string1中的第二个字符替换为string2中的第二个字符,依此类推(核酸序列A与T等互换操作)。如:
$string=”abcdefghicba”;
$string=~tr/abc/def/;#nowstring=”defdefghifed”
当string1比string2长时,其多余字符替换为string2的最后一个字符;
当string1中同一个字符呈现屡次时,将使用榜首个替换字符。
翻译操作符的选项:
c翻译一切未指定字符,
d翻译一切指定字符,
s把多个相同的输出字符缩成一个
$string=~tr/\d//c;把一切非数字字符替换为空格。
$string=~tr/\t//d;删去tab和空格;
$string=~tr/0‐9//cs;把数字间的其它字符替换为一个空格。
$sequence=~tr/ACGTUNacgtun/TGCAANtgcaan/d;###常用的核酸序列取互补序列了

未经允许不得转载:IT技术网站 » perl教程(基础入门篇)
分享到: 更多 (0)

评论 抢沙发

评论前必须登录!

 

志在指尖 用双手敲打未来

登录/注册IT技术大全

热门IT技术

C#基础入门   SQL server数据库   系统SEO学习教程   WordPress小技巧   WordPress插件   脚本与源码下载