您好,欢迎访问三七文档
1基本输入输出在BASH脚本程序中,我们用readvar来实现从键盘的输入,用echo$var来实现输出。那么在Perl中将有一点变化。Perl中将标准输入用关键词表示;标准输出用表示,标准错误输出用表示。故而从标准输入读取数据可以写成:$var=;#读取一行输入,并存入变量$var中。@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;输出的结果是:1123如果在@a两边加上,则输出就都是123了。2分支循环控制结构if语法Perl语言的if...then...else...语句结构和C语言非常相似,该结构一共有三种变种,分别如下:if语法1:if(判别运算式){表达式为真时的语句块;}或写成:表达式为真时的语句if(判别运算式);实例为:print您的分数及格了!\nif($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;}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即304常用系统调用下面将介绍一些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。下面就来分别介绍他们。指令:print语法:printFilehandleLIST说明:这个Filehandle可以看作在I(INPUT)/O(OUTPUT)之间的一个桥梁,可以利用FILEHANDLE来做出数据读入写出的动作。STDIN是代表从哪里输入数据,例如从电脑的键盘输入;STDOUT是代表从哪里输出数据,例如从电脑的屏幕输出;STDERR是代表从哪里输出错误的数据,例如从电脑的屏幕输出。而在PERL语言中有三个标准FILEHANDLE:1.STDIN(标准输入):是代表STDIN的FILEHANDLE2.STDOUT(标准输出):是代表STDOUT的FILEHANDLE3.STDERR(标准错误输出):是代表STDERR的FILEHANDLE如果要使用其他FILEHANDLE的时候,就要先用OPEN这个函数来打开一个FILEHANDLE,我们可以用PRINT这个函数将LIST中的数据输出给FILEHANDLE。语法:printLIST说明:如果省略Filehandle的话,就会把Filehandle默认为STDOUT。也就是会将LIST的数据内容显示在终端屏幕上。语法:print说明:同时省略Filehandle和LIST的话,就会以STDOUT为Filehandle,并会输出$_这个系统内部变量的数据内容。如果$_变量是一个空字符串的话,就会显示出一个空字符串。指令:printf语法:printfFilehandleLIST说明:在Perl语言中也提代C语言中printf的语法,用法和C语言中的用法一模一样。如果把Filehandle省略的话,也一样会把STDOUT当成是默认的Filehandle。示例:printf(chomod%d%s\n,711cgi);会将chmod711cgi加上换行显示于屏幕上。指令:chop语法:chop($url)说明:把最后一个字符删除。示例:$url=($url);这时$url=($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)
本文标题:Perl基本语法
链接地址:https://www.777doc.com/doc-2849786 .html