perl简单语法.docx
- 文档编号:5817143
- 上传时间:2023-01-01
- 格式:DOCX
- 页数:17
- 大小:26.65KB
perl简单语法.docx
《perl简单语法.docx》由会员分享,可在线阅读,更多相关《perl简单语法.docx(17页珍藏版)》请在冰豆网上搜索。
perl简单语法
Perl的简单语法(与C语言的异同)
∙基本输入输出
∙分支循环控制结构
∙函数
∙常用系统调用
∙文件操作
∙进程管理
7.1 基本输入输出
在BASH脚本程序中,我们用readvar来实现从键盘的输入,用echo$var来实现输出。
那么在Perl中将有一点变化。
Perl中将标准输入用关键词
故而从标准输入读取数据可以写成:
$var=
@var=
在Perl语言中,变量$_是许多操作符的缺省变量。
因此如果需要读入许多行并对每行分别处理一般这样写:
while($_=){
chop($_);#chop调用用于去掉$_变量中的最后一个字符(换行符)。
#处理$_(每一行)
}
或者可以简写为:
while(){
chop;#等同于chop($_)
#处理$_(每一行)
}
如果<>括号之间没有任何字符,则表示从命令行所指示的文件中读取数据,看下面这个例子(read.pl):
#!
/usr/bin/perl;
while(<>){
print$_;
}
如果在命令行输入$perlread.plread.pl。
这个程序将在屏幕上打印出文件read.pl的每一行。
在前面的例子中我们已经看见,Perl语言中向标准输出输出数据可以用print语句。
我们在print语句中可以输出多个变量,变量之间用","分隔开来。
如下面的例子:
print3,45*2,"hello",2+2;
上面的输出语句将给出"390hello4"的输出结果。
除了print语句以外,Perl中还提供了一个printf语句用于标准输出,不过printf更接近于C语言的printf函数,可以进行格式化的输出,如:
printf"%10s%8d%8.2f\n",$a,$b,$c;
printf("%10s%8d%8.2f\n",$a,$b,$c);#加上括号的C语言写法也是可以的。
另外print和printf在输出数组变量的时候也是不同的,如下例:
@a=(1,2,3);
printf@a;
print"\n";
print@a;
print"\n";
输出的结果是:
1
123
如果在@a两边加上"",则输出就都是123了。
7.2 分支循环控制结构
if语法
Perl语言的if...then...else...语句结构和C语言非常相似,该结构一共有三种变种,分别如下:
if语法1:
if(判别运算式)
{
表达式为真时的语句块;
}
或写成:
表达式为真时的语句if(判别运算式);
实例为:
print"您的分数及格了!
\n"if($score>=60);
if语法2:
if(判别运算式一){
判别式一为真时的语句块;
}else{
判别式一为假时的语句块;
}
if语法3:
if(判别运算式一)
{
判别式一为真时的语句块;
}elsif(判别运算式二){
判别式二为真时的语句块;
}elsif(判别运算式三){
判别式三为真时的语句块;
}else{
所有判别式为假时的语句块;
}
unless语法
unless的含义就是说“如果判别式不为真,就执行...”。
unless语法1:
unless(判别运算式){
判别式为假时语句块;
}
或写为:
判别式为假时语句unless(判别运算式);
unless语法2:
unless(判别运算式)
{
判别式为假时语句块;
}else{
判别式为真时语句块;
}
进阶技巧:
"&&"、"||"及"?
:
"
这些符号看上去像标点符号,或是表达式的一部分。
和C语言中一样,他们在Perl语言中也可作为控制结构,而且更简洁,只是可读性差了很多。
比如说:
if(判别表达式) {为真时语句块};
也可以写为:
判别表达式&&为真时的语句块
同样道理,unless(this){that}可替换为this||that。
?
:
则可以这样使用:
exp1?
exp2:
exp3
这个式子表示:
如果exp1为真则求exp2的值,否则求exp3的值。
while循环语法
Perl语言中while,do...while,for,until,foreach均可以用于实现循环结构,循环中还可以用last,next,redo等操作符进行控制。
下面我们先介绍while语法。
while(判别运算式){
程序叙述区块;
}
上个语法在Perl中也可以写成:
程序叙述区块while(判别运算式);
do...while循环语法
do
{
程序叙述区块;
}while(判别运算式);
在while和dowhile循环最大的区别是在dowhile循环中,循环体至少会被执行一次。
until循环语法
until(判别运算式)
{
程序叙述区块;
}
上个语法在Perl中也可以写成:
程序叙述区块until(判别运算式);
do...until循环语法
do{
程序叙述区块;
}until(判别运算式);
for循环语法
for(初始化运算式;判别运算式;循环过程运算式)
{
程序叙述区块;
}
或者
for$variable(@array)
{
程序叙述区块;
}
第二个语法中如果把$variable变量省略的话,就会将数组@array的元素一个一个指定给$_这个变量,这是比较精简的写法。
其中第一个语法更接近于C语言的语法。
foreach循环语法
foreach$variable(@array)
{
程序叙述区块;
}
如果把$variable变量省略的话,就会将数组@array的元素一一指定给$_这个内定的输出变量.
last退出循环语法
范例:
for($i=1;$i<=10;$i++)
{
lastif($i==5);#如果$i等于5的话就退出for循环
print"$i\n";
}
next继续循环语法
范例:
for($i<=10;$i++)
{
#如果是2的倍数的话,就到循环的下一个陈述
nextif($i%2)==0)
print"$i是一个奇数!
\n";
}
7.3 函数
Perl语言中有两种函数,一种是Perl自带的一些实用系统函数,如文件打开函数open等;另一种是用户自定义的函数,用户通过自己定义函数可以使得程序的结构化更加清晰。
用户函数又称子程序(Subroutine),在Perl中用下面的结构来定义用户函数:
sub子程序名{
语句块;
}
这里的子程序名与变量的取名规则类似。
与BASH程序不同,Perl中的用户函数的定义可以位于程序的任何位置,比如说放在文件的未尾,而并不需要放在调用该函数的代码之前。
如果两个子程序使用了相同的程序名,位置靠后的子程序将覆盖前面子程序。
需要注意的是用户函数中的变量默认为全局变量,并不是像C语言中那样是局部变量,Perl函数中的变量可以被其他程序段共享。
如果希望定义局部变量,可以用下面两种方法来实现:
local($a);
my$a;
另外用户函数的调用:
通过在子程序前加“&”符号才可以,函数可在任一表达式内被调用。
函数调用可以嵌套,即子程序中可以再调用另外的子程序,即可以程序员可以用Perl写出具有递归特性的代码。
调用用户函数产生的结果称为返回值(returnvalue)。
返回值是每次函数被执行时,最后一个被执行到的表达式的计算结果。
如:
subadd_a_b{
$a+$b;
}
函数最后一条表达式为$a+$b,故返回值为$a+$b的计算结果。
以下是调用情况:
$a=5;
$b=6;
$c=&add_a_b;#$c的值为11
$d=5*&add_a_b;#$d的值为5*11,即55
还有一个问题是,在Perl程序中如何向函数中传递参数呢?
这是可以实现的,调用函数时,可以将参数依次放在函数名后面的"()"中,而在函数体中,系统默认数组@_中就按同样顺序存放着所有的参数。
我们可以访问@_变量,从而确定参数的个数及其数值。
仍以加法函数为例:
subadd_a_b{
$_[0]+$_[1];
}
$c=&add_a_b(5,6);#$c的值为11
$d=5*&add_a_b(2,3);#d的值为5*5即25
更为奇特的是,这种方式可以实现变参数传递,即参数个数不确定的传递。
C语言也可以实现这种传递,如我们熟悉的printf函数,只是他们的实现机制不太一样,C更深奥一些,此处就不多解释了。
subadd_all{
$sum=0;#将sum初始化
foreach$_(@_){#遍历参数列表
$sum+=$_;#累加每个元素
}
$sum;#返回sum即总和的值
}
$a=&add_all(3,4,5);#$a的值为3+4+5即12
$d=2*&add_all(1,2,3,4,5);#d的值为2*15即30
7.4 常用系统调用
下面将介绍一些Perl自身提供的一些标准系统函数,这些函数包括:
print、printf、chop、split、keys、values、reverse、sort、length、substr、index、push、pop、unshift、shift、join、grep、hex、rand、localtime、die、open、close、pack、read、exit。
下面就来分别介绍他们。
指令:
语法:
printFilehandleLIST
说明:
这个Filehandle可以看作在I(INPUT)/O(OUTPUT)之间的一个桥梁,可以利用FILEHANDLE来做出数据读入写出的动作。
STDIN是代表从哪里输入数据,例如从电脑的键盘输入;STDOUT是代表从哪里输出数据,例如从电脑的屏幕输出;STDERR是代表从哪里输出错误的数据,例如从电脑的屏幕输出。
而在PERL语言中有三个标准FILEHANDLE:
1.STDIN(标准输入):
是代表STDIN的FILEHANDLE
2.STDOUT(标准输出):
是代表STDOUT的FILEHANDLE
3.STDERR(标准错误输出):
是代表STDERR的FILEHANDLE
如果要使用其他FILEHANDLE的时候,就要先用OPEN这个函数来打开一个FILEHANDLE,我们可以用PRINT这个函数将LIST中的数据输出给FILEHANDLE。
语法:
printLIST
说明:
如果省略Filehandle的话,就会把Filehandle默认为STDOUT。
也就是会将LIST的数据内容显示在终端屏幕上。
语法:
说明:
同时省略Filehandle和LIST的话,就会以STDOUT为Filehandle,并会输出$_这个系统内部变量的数据内容。
如果$_变量是一个空字符串的话,就会显示出一个空字符串。
指令:
printf
语法:
printfFilehandleLIST
说明:
在Perl语言中也提代C语言中printf的语法,用法和C语言中的用法一模一样。
如果把Filehandle省略的话,也一样会把STDOUT当成是默认的Filehandle。
示例:
printf("chomod%d%s\n","711""cgi");会将chmod711cgi加上换行显示于屏幕上。
指令:
chop语法:
chop($url)
说明:
把最后一个字符删除。
示例:
$url="chop($url);
这时$url=""还可以简写成chop($url="chop函数一般用于去掉从键盘读入数据中的最后一个换行符。
指令:
split
语法:
split(/pattern/,$text,limit)其中/pattern/是文字处理的模式,而limit是代表要分割的个数,一般可以省略。
说明:
用一个指定的文字处理模式来分割$text字符串。
示例:
$text="Michael,Gevin,Mike";@name=split(/,/,$text);#这时@name=("Michael","Gevin","Mike");
@name=split(/,/,$text,2);#这时@name=("Michael","Gevin");
在传送CGI应用程序数据的时候会先将数据编码,其中会将FORM中第个数据字段的数据内容用&这个符号隔开,所以在解码的时候就要以"&"这个符号为分割的字符,将每个数据字段分割出。
而数据字段的名称和这个数据字段的值是用=这个符号来隔开,如果想取得数据字段的名称和所对应的值的话,就用要"="这个符号来分割数据字段,
指令:
keys
语法:
keys(%array)
说明:
取出关联数组%ARRAY中全部的key。
示例:
%NAME=(1,"mike",2,"michael");@readkey=keys(%NAMES);#这时@readkey=(1,2);
指令:
values
语法:
values(%array)
说明:
取出关联数组%ARRAY中全部的value。
示例:
%NAMES=(1,"mike",2,"michael");@readval=values(%NAMES);#这时@readval=("mike","michael");
指令:
reverse
语法:
reverse(@array)
说明:
将数组@array中的元素由后到前重新排列。
示例:
@back=("A","B","C","D","E");@back=reverse(@back);#这时@back=("E","D","C","B","A");
指令:
sort
语法:
sort(@array)
说明:
将数组中的元素由小到大排序,如果要由大到小排序的话,要加上reverse这个函数。
示例:
@abc=("d","b","c","a");@abc=sort(@abc);#这时@abc=("a","b","c","d");
@abc=(reversesort@abc);#这时@abc=("d","c","b","a");这个语法也可以写成@abc=(reversesort(@abc));
@number=(5,2,10);@number=sort(@number);
#上面示例用sort函数来排序数值的时,会出差错,因此要用下面到下面这一句。
@number=(sort{$a<=>$b}@number);#这时@number=(2,5,10);
指令:
length
语法:
length($string)
说明:
求出字符串$string的字节(bytes)值。
示例:
$string="Perl5";$size=length($string);#这时$size=5;
指令:
substr
语法:
substr($string,offset,length)offset代表起始字符的位置,length代表引用的字符串长度,如果省略length则代表从起始值到字符串的最后一个字符长度。
而offset如果是负值的话,就会从字符串右边开始指定字符。
示例:
$s=substr("perl5",2,2);#这时$s="rl";
$s=substr("perl5",2);#这时$s="rl5";
$s=substr("perl5",-2,2);#这时$s="er";
指令:
index
语法:
index($string,$substring,position)$substring是要寻找的字符;position代表从哪一个位置开始寻找,假如省略position就从头开始找起。
说明:
返回所要找寻的字符在一字符串$string中的位置,如果在字符串中找不到字符的话,则会返回-1这个值。
示例:
$s=index("perl5","p");#这时$s=0
$s=index("perl5","l",2);#这时$s=3
$s=index("perl5","perl");#这时$s=-1
指令:
push
语法:
push(@array,$string)
说明:
在数组@array的最后附加新的元素($string)到数组@array中。
示例:
@array=("one","two");push(@array,"three");#这时@array=("one","two","three")
指令:
pop
语法:
pop(@array)
说明:
将数组(@array)的最后一个元素删除,并将删除的元素返回。
示例:
@array=("one","two");$rm=pop(@array);#这时@array=("one");而$rm="two";
指令:
unshift
语法:
unshift(@array,$string)
说明:
在数组@array的第一个元素前附加新的元素$string到数组@array中。
示例:
@array=("one","two");unshift(@array,"three");#这时@array=("three","one","two")
指令:
shift
语法:
shift(@array)
说明:
将数组@array的第一个元素删除,并将删除的元素返回。
示例:
@array=("one","two");@rm=shift(@array);#这时@array=("two");而$rm="one";
指令:
join
语法:
join($string,@array)
说明:
在一数组@array的元素之间加上一指定的字符$string,并将结果返回。
示例:
@array=("one","two","three");
$total=join(":
",@array);这时$total="one:
two:
three";
指令:
grep
语法:
grep(/pattern/,@array)
说明:
将合文字处理模式(regularexpression)的数组元素找出来。
示例:
@array=("one","on","in");
$count=grep(/on/,@array);#这时$count=2
@result=grep(/on/,@array);#这时@result=("one","on");
指令:
hex
语法:
hex($string)
说明:
将十六进制的数值转成十进制。
示例:
$decimal=hex("ff");这时$decimal=255;
指令:
rand
语法:
rand($interger)
说明:
常和函数srand搭配来取得一随机数,如果没有先宣告stand函数的话,则取出的常数值是一个固定值。
这个语法会返回一个介于0和$interger之间的数值,如果$interger省略的话,则会返回一个介于0和1的数值。
示例:
srand;#要先调用一次srand函数,才能产生随机数的效果
$int=rand(10);#$int的值会大于0而且小于10,如果希望产生的乱数是整数的话,就要再加上int这个函数,如下
$int=int(rand(10));#$int的值是一个整数,且值在0和9之间
指令:
localtime
语法:
localtime(time)
说明:
可返回九个有关时间的元素,在写CGI应用程序的时候常会用到系统的时间,所以在此会详细介绍这个函数的用法。
示例:
($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst)=localtime(time);
其中:
$sec代表秒数[0,59]、$min代表分数[0,59]、$hour代表小时数[0,23]、$mday代表是在这个月的第几天[1,31]、$mon代表月数[0,11]因此要将$mon加1之后,才能符合实际情况、$year从1990年算起的年数、$wday从星期六算起,代表是在这周中的第几天[0-6]、$yday从一月一日算起,代表是在这年中的第几天[0,366]、$isdst只是一个flag知道这些变量之后,就可以在CGI应用程序中拿来应用了。
此外,也可以用下面这一行指令在UNIX系统下取得系统的时间。
为了避免错误发生,最好用绝对路径的方法来取得系统时间,如果绝对路径不清楚的话可以用"whichdata"这个指令来得知。
$data='/usr/bin/data';而在Perl5版本中,也可以用下面这一行指令来取得系统时间。
$data=localtime(time);
指令:
die
语法:
dieLIST
说明:
会把LIST字符串显示出来,并退出程序。
常常和$!
这个代表错误信息变量一起使用。
示例:
open(FILE,"$filename")||die"不能打开文件$!
\n;#如果打开文件失败的话,就会显示出错误的信息,之后再退出程序。
指令:
open
语法1:
open(filehandle,"$filename")其中$filename是一个指定打开的文件名。
说明:
这是一个很常用的函数,可用于文件的打开(readonly)。
示例:
$filename="usr/abc.txt";
open(FILE,"$filename")||die"不能打开文件$filename\n;#将<file>数据指定给纯变量$line(一行一行地)
while($line=
{
print"$line";
}
close(f
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- perl 简单 语法
![提示](https://static.bdocx.com/images/bang_tan.gif)