perl零基础教程.docx
《perl零基础教程.docx》由会员分享,可在线阅读,更多相关《perl零基础教程.docx(33页珍藏版)》请在冰豆网上搜索。
![perl零基础教程.docx](https://file1.bdocx.com/fileroot1/2023-1/22/22814ee3-1a98-4642-bbdb-cb8e5fea146d/22814ee3-1a98-4642-bbdb-cb8e5fea146d1.gif)
perl零基础教程
perl教程
第一节:
基本上,简单变量就是一个数据单元,这个单元可以是数字或字符串。
一、整型
1、整型
PERL最常用的简单变量,由于其与其它语言基本相同,不再赘述。
例:
$x=12345;
if(1217+116==1333){
#statementblockgoeshere
}
整型的限制:
PERL实际上把整数存在你的计算机中的浮点寄存器中,所以实际上被当作浮点数看待。
在多数计算机中,浮点寄存器可以存贮约16位数字,长于此的被丢弃。
整数实为浮点数的特例。
2、8进制和16进制数
8进制以0打头,16进制以0x打头。
例:
$var1=047;(等于十进制的39)
$var2=0x1f;(等于十进制的31)
二、浮点数
如11.4、-0.3、.3、3.、54.1e+02、5.41e03
浮点寄存器通常不能精确地存贮浮点数,从而产生误差,在运算和比较中要特别注意。
指数的范围通常为-309到+308。
例:
#!
/usr/local/bin/perl
$value=9.01e+21+0.01-9.01e+21;
print("firstvalueis",$value,"\n");
$value=9.01e+21-9.01e+21+0.01;
print("secondvalueis",$value,"\n");
---------------------------------------------------------
$program3_3
firstvalueis0
secondvalueis0.01
三、字符串
惯用C的程序员要注意,在PERL中,字符串的末尾并不含有隐含的NULL字符,NULL字符可以出现在串的任何位置。
.双引号内的字符串中支持简单变量替换,例如:
$number=11;
$text="Thistextcontainsthenumber$number.";
则$text的内容为:
"Thistextcontainsthenumber11."
.双引号内的字符串中支持转义字符
Table3.1.Escapesequencesinstrings.
EscapeSequenceDescription
\aBell(beep)
\bBackspace
\cnTheCtrl+ncharacter
\eEscape
\EEndstheeffectof\L,\Uor\Q
\fFormfeed
\lForcesthenextletterintolowercase
\LAllfollowinglettersarelowercase
\nNewline
\rCarriagereturn
\QDonotlookforspecialpatterncharacters
\tTab
\uForcenextletterintouppercase
\UAllfollowinglettersareuppercase
\vVerticaltab
\L、\U、\Q功能可以由\E关闭掉,如:
$a="T\LHISISA\ESTRING";#sameas"ThisisaSTRING"
.要在字符串中包含双引号或反斜线,则在其前加一个反斜线,反斜线还可以取消变量替换,如:
$res="Aquote\"andAbackslash\\";
$result=14;
print("Thevalueof\$resultis$result.\n")的结果为:
Thevalueof$resultis14.
.可用\nnn(8进制)或\xnn(16进制)来表示ASCII字符,如:
$result="\377";#thisisthecharacter255,orEOF
$result="\xff";#thisisalso255
.单引号字符串
单引号字符串与双引号字符串有两个区别,一是没有变量替换功能,二是反斜线不支持转义字符,而只在包含单引号和反斜线时起作用。
单引号另一个特性是可以跨多行,如:
$text='Thisistwo
linesoftext
';
与下句等效:
$text="Thisistwo\nlinesoftext\n";
.字符串和数值的互相转换
例1:
$string="43";
$number=28;
$result=$string+$number;#$result=71
若字符串中含有非数字的字符,则从左起至第一个非数字的字符,如:
$result="hello"*5;#$result=0
$result="12a34"+1;#$result=13
.变量初始值
在PERL中,所有的简单变量都有缺省初始值:
"",即空字符。
但是建议给所有变量赋初值,否则当程序变得大而复杂后,很容易出现不可预料且很难调试的错误。
第二节:
一、算术操作符:
+(加)、-(减)、*(乘)、/(除)、**(乘幂)、%(取余)、-(单目负)
(1)乘幂的基数不能为负,如(-5)**2.5#error;
(2)乘幂结果不能超出计算机表示的限制,如10**999999#error
(3)取余的操作数如不是整数,四舍五入成整数后运算;运算符右侧不能为零
(4)单目负可用于变量:
-$y;#等效于$y*-1
二、整数比较操作符
Table3.1.整数比较操作符
操作符描述
<小于
>大于
==等于
<=小于等于
>=大于等于
!
=不等于
<=>比较,返回1,0,or-1
操作符<=>结果为:
0-两个值相等
1-第一个值大
1-第二个值大
三、字符串比较操作符
Table3.2.字符串比较操作符
操作符描述
lt小于
gt大于
eq等于
le小于等于
ge大于等于
ne不等于
cmp比较,返回1,0,or-1
四、逻辑操作符
逻辑或:
$a||$b或$aor$b
逻辑与:
$a&&$b或$aand$b
逻辑非:
!
$a或not$a
逻辑异或:
$axor$b
五、位操作符
位与:
&
位或:
|
位非:
~
位异或:
^
左移:
$x<<1
右移:
$x>>2
注:
不要将&用于负整数,因为PERL将会把它们转化为无符号数。
六、赋值操作符
Table3.3.赋值操作符
操作符描述
=Assignmentonly
+=Additionandassignment
-=Subtractionandassignment
*=Multiplicationandassignment
/=Divisionandassignment
%=Remainderandassignment
**=Exponentiationandassignment
&=BitwiseANDandassignment
|=BitwiseORandassignment
^=BitwiseXORandassignment
Table3.4.赋值操作符例子
表达式等效表达式
$a=1;none(basicassignment)
$a-=1;$a=$a-1;
$a*=2;$a=$a*2;
$a/=2;$a=$a/2;
$a%=2;$a=$a%2;
$a**=2;$a=$a**2;
$a&=2;$a=$a&2;
$a|=2;$a=$a|2;
$a^=2;$a=$a^2;
.=可在一个赋值语句中出现多次,如:
$value1=$value2="astring";
.=作为子表达式
($a=$b)+=3;
等价于
$a=$b;
$a+=3;
但建议不要使用这种方式。
七、自增自减操作符:
++、--(与C++中的用法相同)
.不要在变量两边都使用此种操作符:
++$var--#error
.不要在变量自增/减后在同一表达式中再次使用:
$var2=$var1+++$var1;#error
.在PERL中++可用于字符串,但当结尾字符为'z'、'Z'、'9'时进位,如:
$stringvar="abc";
$stringvar++;#$stringvarcontains"abd"now
$stringvar="aBC";
$stringvar++;#$stringvarcontains"aBD"now
$stringvar="abz";
$stringvar++;#$stringvarnowcontains"aca"
$stringvar="AGZZZ";
$stringvar++;#$stringvarnowcontains"AHAAA"
$stringvar="ab4";
$stringvar++;#$stringvarnowcontains"ab5"
$stringvar="bc999";
$stringvar++;#$stringvarnowcontains"bd000"
.不要使用--,PERL将先将字符串转换为数字再进行自减
$stringvar="abc";
$stringvar--;#$stringvar=-1now
.如果字符串中含有非字母且非数字的字符,或数字位于字母中,则经过++运算前值转换为数字零,因此结果为1,如:
$stringvar="ab*c";
$stringvar++;
$stringvar="ab5c";
$stringvar++;
八、字符串联结和重复操作符
联接:
.
重复:
x
联接且赋值(类似+=):
.=
例:
$newstring="potato"."head";
$newstring="t"x5;
$a="be";
$a.="witched";#$aisnow"bewitched"
九、逗号操作符
其前面的表达式先进行运算,如:
$var1+=1,$var2=$var1;
等价于
$var1+=1;
$var2=$var1;
使用此操作符的唯一理由是提高程序的可读性,将关系密切的两个表达式结合在一起,如:
$val=26;
$result=(++$val,$val+5);#$result=32
注意如果此处没有括号则意义不同:
$val=26;
$result=++$val,$val+5;#$result=27
十、条件操作符
与C中类似,条件?
值1:
值2,当条件为真时取值1,为假时取值2,如:
$result=$var==0?
14:
7;
$result=43+($divisor==0?
0:
$dividend/$divisor);
PERL5中,还可以在赋值式左边使用条件操作符来选择被赋值的变量,如:
$condvar==43?
$var1:
$var2=14;
$condvar==43?
$var1=14:
$var2=14;
十一、操作符的次序
Table3.6.操作符次序
操作符描述
++,--自增,自减
-,~,!
单目
**乘方
=~,!
~模式匹配
*,/,%,x乘,除,取余,重复
+,-,.加,减,联接
<<,>>移位
-e,-r,etc.文件状态
<,<=,>,>=,lt,le,gt,ge不等比较
==,!
=,<=>,eq,ne,cmp相等比较
&位与
|,^位或,位异或
&&逻辑与
||逻辑或
..列表范围
?
and:
条件操作符
=,+=,-=,*=,赋值
andsoon
逗号操作符
notLow-precedencelogicalNOT
andLow-precedencelogicalAND
or,xorLow-precedencelogicalORandXOR
.操作符结合性(associativity):
Table3.7.操作符结合性
操作符结合性
++,--无
-,~,!
Right-to-left
**Right-to-left
=~,!
~Left-to-right
*,/,%,xLeft-to-right
+,-,.Left-to-right
<<,>>Left-to-right
-e,-r,无
<,<=,>,>=,lt,le,gt,geLeft-to-right
==,!
=,<=>,eq,ne,cmpLeft-to-right
&Left-to-right
|,^Left-to-right
&&Left-to-right
||Left-to-right
..Left-to-right
?
and:
Right-to-left
=,+=,-=,*=,Right-to-left
andsoon
Left-to-right
notLeft-to-right
andLeft-to-right
or,xorLeft-to-right
建议:
1、当你不确定某操作符是否先执行时,一定要用括号明确之。
2、用多行、空格等方式提高程序的可读性。
第三节:
一、列表
列表是包含在括号里的一序列的值,可以为任何数值,也可为空,如:
(1,5.3,"hello",2),空列表:
()。
注:
只含有一个数值的列表(如:
(43.2))与该数值本身(即:
43.2)是不同的,但它们可以互相转化或赋值。
列表例:
(17,$var,"astring")
(17,26<<2)
(17,$var1+$var2)
($value,"Theansweris$value")
二、数组--列表的存贮
列表存贮于数组变量中,与简单变量不同,数组变量以字符"@"打头,如:
@array=(1,2,3);
注:
(1)数组变量创建时初始值为空列表:
()。
(2)因为PERL用@和$来区分数组变量和简单变量,所以同一个名字可以同时用于数组变量和简单变量,如:
$var=1;
@var=(11,27.1,"astring");
但这样很容易混淆,故不推荐。
1、数组的存取
.对数组中的值通过下标存取,第一个元素下标为0。
试图访问不存在的数组元素,则结果为NULL,但如果给超出数组大小的元素赋值,则数组自动增长,原来没有的元素值为NULL。
如:
@array=(1,2,3,4);
$scalar=$array[0];
$array[3]=5;#now@arrayis(1,2,3,5)
$scalar=$array[4];#now$scalar=null;
$array[6]=17;#now@arrayis(1,2,3,5,"","",17)
.数组间拷贝
@result=@original;
.用数组给列表赋值
@list1=(2,3,4);
@list2=(1,@list1,5);#@list2=(1,2,3,4,5)
.数组对简单变量的赋值
(1)@array=(5,7,11);
($var1,$var2)=@array;#$var1=5,$var2=7,11被忽略
(2)@array=(5,7);
($var1,$var2,$var3)=@array;#$var1=5,$var2=7,$var3=""(null)
.从标准输入(STDIN)给变量赋值
$var=;
@array=;#^D为结束输入的符号
2、字符串中的方括号和变量替换
"$var[0]"为数组@var的第一个元素。
"$var[0]"将字符"["转义,等价于"$var"."[0]",$var被变量替换,[0]保持不变。
"${var}[0]"亦等价于"$var"."[0]"。
"${var}"则取消了大括号的变量替换功能,包含文字:
${var}.
3、列表范围:
(1..10)=(1,2,3,4,5,6,7,8,9,10)
(2,5..7,11)=(2,5,6,7,11)
(3..3)=(3)
.用于实数
(2.1..5.3)=(2.1,3.1,4.1,5.1)
(4.5..1.6)=()
.用于字符串
("aaa".."aad")=("aaa","aab","aac","aad")
@day_of_month=("01".."31")
.可包含变量或表达式
($var1..$var2+5)
.小技巧:
$fred="Fred";
print(("Hello,".$fred."!
n")x2);
其结果为:
Hello,Fred!
Hello,Fred!
4、数组的输出:
(1)@array=(1,2,3);
print(@array,"n");
结果为:
123
(2)@array=(1,2,3);
print("@arrayn");
结果为:
123
5、列表/数组的长度
当数组变量出现在预期简单变量出现的地方,则PERL解释器取其长度。
@array=(1,2,3);
$scalar=@array;#$scalar=3,即@array的长度
($scalar)=@array;#$scalar=1,即@array第一个元素的值
注:
以数组的长度为循环次数可如下编程:
$count=1;
while($count<=@array){
print("element$count:
$array[$count-1]n");
$count++;
}
6、子数组
@array=(1,2,3,4,5);
@subarray=@array[0,1];#@subarray=(1,2)
@subarray2=@array[1..3];#@subarray2=(2,3,4)
@array[0,1]=("string",46);#@array=("string",46,3,4,5)now
@array[0..3]=(11,22,33,44);#@array=(11,22,33,44,5)now
@array[1,2,3]=@array[3,2,4];#@array=(11,44,33,5,5)now
@array[0..2]=@array[3,4];#@array=(5,5,"",5,5)now
可以用子数组形式来交换元素:
@array[1,2]=@array[2,1];
7、有关数组的库函数
(1)sort--按字符顺序排序
@array=("this","is","a","test");
@array2=sort(@array);#@array2=("a","is","test","this")
@array=(70,100,8);
@array=sort(@array);#@array=(100,70,8)now
(2)reverse--反转数组
@array2=reverse(@array);
@array2=reversesort(@array);
(3)chop--数组去尾
chop的意义是去掉STDIN(键盘)输入字符串时最后一个字符--换行符。
而如果它作用到数组上,则将数组中每一个元素都做如此处理。
@list=("rabbit","12345","quartz");
chop(@list);#@list=("rabbi","1234","quart")now
(4)join/split--连接/拆分
join的第一个参数是连接所用的中间字符,其余则为待连接的字符数组。
$string=join("","this","is","a","string");#结果为"thisisastring"
@list=("words","and");
$string=join(":
:
",@list,"colons");#结果为"words:
:
and:
:
colons"
@array=split(/:
:
/,$string);#@array=("words","and","colons")now
第四节:
一、条件判断
if(){
}
elsif(){
}
...
else{
}
二、循环:
1、while循环
while(){
}
2、until循环
until(){
}
3、类C的for循环,如
for($count=1;$count<=5;$count++){
#statementsinsidetheloopgo