perl学习笔记.docx
《perl学习笔记.docx》由会员分享,可在线阅读,更多相关《perl学习笔记.docx(12页珍藏版)》请在冰豆网上搜索。
![perl学习笔记.docx](https://file1.bdocx.com/fileroot1/2023-1/28/a6a42991-fb85-4f52-b6c8-888d94401f41/a6a42991-fb85-4f52-b6c8-888d94401f411.gif)
perl学习笔记
Perl快速入门
1、标量
标量是一种变量,只能保存单个值、单个字符串或单个数字。
标量名必须以美元符号“$”开头。
标量上下文则负责表明当前正在使用单个值的情况
EXAMPLE
$first_name="Melanie";
$last_name="Quigley";
$salary=125000.00;
print$first_name,$last_name,$salary;
2、数组
数组是一组有序排列的标量,如字符串和/或数字。
数组中的各个元素由从0开始的整数来索
引。
数组变量名以“@”符号开头
@names=("Jessica","Michelle","Linda");
print"$names";#Printsthearraywithelementsseparatedbyaspace
print"$names[0]and$names[2]";#Prints"Jessica"and"Linda"
print"$names[-1]\n";#Prints"Linda"
$names[3]="Nicole";#Assignanewvalueasthe4thelement
下面是一些常用的内建函数:
pop移除最后一个元素
push把新元素添加到数组末尾
shift移除第一个元素
unshift把新元素添加到数组开头
splice在数组指定位置添加或移除数组元素
sort对数组元素进行排序
3、散列
关联数组(associativearray),又称为散列(hash),是一组未经排序的键/值对(key-value
pair),并通过字符串进行索引。
散列变量名以“%”号开头(请注意,若位于单引号或双引号中的话,%符号将不会解析)
EXAMPLE
%employee=(
"Name"=>"JessicaSavage",
"Phone"=>"(925)555-1274",
"Position"=>"CEO");
Print$employee{"Name"};#Printavalue
$employee{"SSN"}="999-333-2345";#Assignakey/value
4、预定义变量
Perl提供了大量的预定义变量。
下面列举了常用的一些预定义变量:
$_在执行输入和模式搜索操作时使用的默认空格变量
$.文件中最后处理的当前行号
$@由最近一个eval()运算符提供的Perl语法报错信息
$!
获取当前错误信息值,常用于die命令
$0含有正在执行的程序名
$$正在执行本脚本的Perl进程号
$PERL_VERSION/$^VPerl解释器的版本、子版本和修订版本信息
@ARGV含有命令行参数
ARGV一个特殊的文件句柄,用于遍历@ARGV中出现的所有文件名
@INC库文件的搜索路径
@_在子例程中,@_变量含有传给该子例程的变量内容
%ENV关联数组型变量%ENV含有当前环境信息
%SIG关联数组型变量%SIG含有指向信号内容的句柄
5、常量
固定不变的值,一旦设置就不能再更改。
典型的常量包括PI,或一英里长度的英尺数。
这些值都是从不变化的。
用户可借助constant保留字来定义常量,这里给出示例如下:
EXAMPLE
useconstantBUFFER_SIZE=>4096;
useconstantPI=>4*atan21,1;
useconstantDEBUGGING=>0;
usecontstantISBN=>"0-13-028251-0";
PI=6;#CannotmodifyPI;producesanerror.
6、运算符
Perl提供了多种运算符,但是其主要内容与C/C++、Java或PHP运算符类似。
运算符包括如下几种
赋值运算符=、+=、-=、*=、%=、^=、&=、|=、.=
算术相等==、!
=、<=>
字符串相等eq、ne、cmp
算术大小关系>、>=、<、<=
字符串大小关系gt、ge、lt、le
范围运算符5..10#范围是5至10之间,逐个递增
逻辑运算符&&、and、||、or、XOR、xor、!
自动递增/递减++、--
文件运算符-r、-w、-x、-o、-e、-z、-s、-f、-d、-l,等等
位运算符~、&、|、^、<<、>>
字符串连接.
字符串复制x
代数运算符*、/、-、+、%
模式匹配=~、!
~
EXAMPLE
print"\nArithmeticOperators\n";
print((3+2)*(5-3)/2);
print"\nStringOperators\n";#Concatenation
print"\tTommy".''."Savage";
print"\nComparisonOperators\n";
print5>=3,"\n";
print47==23,"\n";
print"\nLogicalOperators\n";
$a>$b&&$b<100
$answereq"yes"||$money==200
print"\nCombinedAssignmentOperators\n";
$a=47;
$a+=3;#shortfor$a=$a+3
$a++;#autoincrement
print$a;#Prints51
print"\nPatternMatchingOperators\n"
$color="green";
printif$color=~/^gr/;#$colormatchesapattern
#startingwith'gr'
$answer="Yes";
printif$answer!
~/[Yy]/;#$answermatchesapattern
#containing'Y'or'y'
7、if语句
基本的if语句能够判断小括号内的表达式取值,如果值为true,则执行其后跟随的表达式。
if(表达式){
语句;
}
EXAMPLE
if($a==$b){print"$aisequalto$b";}
8、if/else语句
if/else实现了双向判断。
如果if后面表达式条件为true,则执行其后的语句;
否则执行else后面的语句。
if(表达式){
语句;
}else{
语句;
}
EXAMPLE
$coin_toss=int(rand
(2))+1;#Generatearandom#numberbetween1and2
if($coin_toss==1){
print"YoutossedHEAD\n";
}
else{
print"YoutossedTAIL\n";
}
9、if/elsif语句
if/elsif/else提供了多路分支选择功能。
如果if后面的表达式值不是true,则会依次判断其后每个elsif的条件,直到其中某个条件值为true;如果没有一个为true的话,则执行最后的else语句。
if(表达式){
语句;
elsif(表达式){
语句;
}elsif(表达式){
语句;
else{
语句;
}
EXAMPLE
#1isMonday,7Sunday
$day_of_week=int(rand(7))+1;
print"Todayis:
$day_of_week\n";
if($day_of_week>=1&&$day_of_week<=4){
print"Businesshoursarefrom9amto9pm\n";
}
elsif($day_of_week==5){
print"Businesshoursarefrom9amto6pm\n";
}
else{
print"Weareclosedonweekends\n";
}
10、if/else简化模式
和C/C++类似,Perl也为if/else语法结构提供了相应的简化模式,该模式拥有两个运算符和三个操作数(因此又称为三元运算符)。
如果条件值为true,则执行紧跟在问号后面的语句;如果是false,则执行冒号后面的语句。
其格式为:
(条件)?
条件为true时执行的语句:
条件为false时执行的语句
EXAMPLE
$coin_toss=int(rand
(2))+1;#Generatearandomnumber#between1and2
print($coin_toss==1?
"YoutossedHEAD\n":
"YoutossedTAIL\n");
11、while循环、do-while循环
循环结构能够指定一段重复执行多次的代码。
Perl支持多种不同类型的循环:
while循环、do-while循环、for循环以及foreach循环。
while/until循环
while循环:
while后面跟随一个以小括号包围起来的表达式,以及一段执行语句。
当表达式取值为true时,便继续执行循环内容。
其语法结构为:
while(条件表达式){
代码段A
}
EXAMPLE
$count=0;
while($count<10){
print$count;
$count++;
}
12、until循环:
until后面跟随一个以小括号包围起来的表达式,以及一段执行语句。
当表达式取值为false时,继续执行循环内容。
其语法结构为:
until(条件表达式){代码段A
}
EXAMPLE
$count=0;
until($count==10){
print$count;
$count++;
}
13、do-while循环
do-while循环类似于while循环,所不同的是它是在循环体末尾检查循环表达式的,而不是在开头检查。
这就保证了循环体至少能执行一次。
其代码结构为:
do{
代码段A
}while(表达式);
EXAMPLE
$count=0;
do{
print"$count";
$count++;}
while($count<10);
14、for循环
for循环需要判断三个条件表达式的取值,各表达式之间以分号隔开。
第一个表达式负责初始化变量,在整个循环过程中只调用一次。
第二个表达式负责判断条件值是否为true,如果是true的话便执行循环体;否则就退出循环。
当循环体执行完毕后,控制权便转移到第三个表达式,由它负责更新待检测变量的值。
然后,再由第二个表达式进行下一次判断,如此反复。
其代码结构如下所示:
for(初始化鍬量;条件表达式;自加/自减)
{代嗎段
}
EXAMPLE
for($count=0;$count<10;$count=$count+1){
print"$count\n";
}
15、foreach循环
foreach循环仅用于逐个遍历列表(list)内容。
foreach$列表项(@列表){
print$列表项,"\n";
}
EXAMPLE
@dessert=("icecream","cake","pudding","fruit");
foreach$choice(@dessert){
print"Dessertchoiceis:
$choice\n";
}
16、循环控制 last/next
last语句可用于从循环体中跳出一个循环。
next语句可用于跳过当前这次循环的剩余内容,直接从头开始下一轮循环。
EXAMPLE
$n=0;
while($n<10){
print$n;
if($n==3){
last;}
$n++;
}print"Outoftheloop";
EXAMPLE
for($n=0;$n<10;$n++){
if($n==3){
next;#Startattopofloop;#skipremainingstatementsinblock
}
echo"$n";
}print"Outoftheloop";
17、函数(function)
是一组能完成某项任务的代码体,并供程序其他部分调用。
用户可以通过参数将数据传送给这个函数。
函数可以有返回值,也可以不返回任何值。
任何合法的Perl代码均可出现在函数体的定义中。
定义于函数外面的变量在函数体内也同样可用。
而my函数则能把指定的变量局部化。
subfunction_name{
函数体
}
EXAMPLE
subgreetings(){
print"WelcometoPerl!
";#Functiondefinition
}
&greetings;#Functioncall
greetings();#Functioncall
EXAMPLE
$my_year=2000;
if(is_leap_year($my_year)){#Callfunctionwithanargument
print"$my_yearisaleapyear\n";
}
else{
print"$my_yearisnotaleapyear";
}
subis_leap_year{#Functiondefinition
my$year=shift(@_);#Shiftofftheyearfrom#theparameterlist,@_
return((($year%4==0)&&($year%100!
=0))||($year%400==0))?
1:
0;
}
18、文件处理
Perl提供了open函数用于打开文件,也提供了pipe,用于读写、追加文件内容。
其中,open函数的参数包括一个用户自定义的文件句柄(一般表现为一串大写字符),以及一个含有文件路径和读/写/追加标志的字符串
EXAMPLE
Toopenafileforreading:
open(FH,"open(DB,"/home/ellie/myfile")ordie"Can'topenfile:
$!
\n";
Toopenafileforwriting:
open(FH,">filename");#Opens"filename"forwriting.#Createsortruncatesfile.
Toopenafileforappending:
open(FH,">>filename");#Opens"filename"forappending.#Createsorappendstofile.
Toopenafileforreadingandwriting:
open(FH,"+open(FH,"+>filename");#Opens"filename"forwrite,thenread.
Tocloseafile:
close(FH);
Toreadfromafile:
while(){print;}#Readonelineatatimefromfile.
@lines=;#Slurpalllinesintoanarray.
print"@lines\n";
Towritetoafile:
open(FH,">file")ordie"Can'topenfile:
$!
\n";
printFH"Thislineiswrittentothefilejustopened.\n";
printFH"Andthislineisalsowrittentothefilejustopened.\n";
EXAMPLE
ToTestFileAttributes
print"Fileisreadable,writeable,andexecutable\n"if-r$fileand
-w_and-x_;#Isitreadble,writeable,andexecutable?
print"Filewaslastmodified",-M$file,"daysago.\n";#Whenwasitlastmodified?
print"Fileisadirectory.\n"if-d$file;#Isitadirectory?
19、管道
管道用于把系统命令输出内容作为输入流传送给Perl,或者将Perl的输出内容转发给系统命令以作为其输入。
管道又称作过滤器(filter)。
用户必须通过open系统调用来使用管道。
该系统调用接受两个参数:
一个用户自定义的句柄和一个操作系统命令,并需在操作系统命令的前面或者后面加上一个“|”符号。
如果“|”符号出现在命令之前,则表示该命令将把Perl的输出作为输入内容;否则表示Perl将读取该命令的输出内容。
也就是说,如果命令后面带有“|”,就表示Perl将从管道中读取输入内容;否则说明Perl将把输出内容写入到管道中去。
EXAMPLE
Inputfilter
open(F,"ls|")ordie;#Openapipetoreadfrom
while(){print;}#PrintslistofUNIXfiles
Outputfiler
open(SORT,"|sort")ordie;#Openpipetowriteto
printSORT"dogs\ncats\nbirds\n"#Sortsbirds,cats,dogsonseparatelines.
20、正则表达式
所谓正则表达式,是由斜杠圈起的一组字符集合。
它们可用于在文本中匹配指定模式,并进行相应替换操作。
一直以来,Perl都因为其优秀的模式匹配机制而闻名于世。
元字符表达含义
^ 匹配行首
$ 匹配行尾
a.c 匹配一个a,后面任意单个字符,再后面是一个c的情况
[abc] 匹配a或者b或者c的情况
[^abc] 匹配字符既不是a又不是b也不是c的情况
[0-9] 匹配位于0到9之间的单个数字
ab*c 匹配一个a后面跟0到多个b,最后是一个c的情况
ab+c 匹配一个a后面跟1到多个b,最后是一个c的情况
ab?
c 匹配一个a后面跟0到1个b,最后是一个c的情况
(ab)+c 匹配1到多个ab后面跟着1个c的情况
(ab)(c) 捕获ab并将其值赋予变量$1,同时捕获c值并赋予$2
EXAMPLE
$_="lookingforaneedleinahaystack";
printif/needle/;
If$_containsneedle,thestringisprinted.
$_="lookingforaneedleinahaystack";#Usingregularexpressionmetacharacters
printif/^[Nn]..dle/;
#charactersand"dle".
$str="Iamfeelingblue,blue,blue..."
$str=~s/blue/upbeat/;#Substitutefirstoccurrenceof"blue"with"upbeat"
print$str;
Iamfeelingupbeat,blue,blue...
$str="IamfeelingBLue,BLUE...";
$str=~s/blue/upbeat/ig;#Ignorecase,globalsubstitution
print$str;
Iamfeelingupbeat,upbeat...
$str="PeaceandWar";
$str=~s/(Peace)and(War)/$2,$1/i;#$1gets'Peace',$2gets'War'
print$str;
WarandPeace.
$str="Hegaveme5dollars.\n"
s/5/6*7/e;#Ratherthanstringsubstitution,evaluatereplacementside
print$str;
Hegaveme42dollars."