您好,欢迎来到欧得旅游网。
搜索
您的当前位置:首页perl基本语法介绍

perl基本语法介绍

来源:欧得旅游网
perl基本语法介绍

Perl 的数据类型⼤致分为四种:Scalar(变量)、Scalar Array(数组)、Hash Array(散列)、References(指针),看起来虽少但⽤起来却绰绰有余。尤其在写Perl程序时可以不必事先宣告变量,这⼀点对刚学程序语⾔的⼈甚为⽅便,不过为了以后程序除错和维护⽅便,我建议你还是养成事先声明变量的习惯⽐较好。

纯量变量是Perl⾥最基本的⼀种数据型态,它可以代表⼀个字符、字符串、整数、甚⾄浮点数,⽽Perl把它们都看成是⼀样的东东! 你甚⾄可以混着⽤,不可思议吧。例如: # 井字号开头的后⾯都是批注。 # 纯量变数以$开头。

# my 是⼀种宣告变量的⽅式,它可以使变量区域化。

# 宣告变量时若不加 my 或 local 则Perl会把它当作全域变量使⽤。 # 习惯上,我们会将字符串⽤双引号括起来,⽽数值就不⽤加引号。 my $x=\"abc\"; my $x=123; my $x=4.56;

1)、算术运算符

+(加)、-(减)、*(乘)、/(除)、**(幂)、%(余)、-(负)

(1)求幂(**) 结果不能超出数的范围。当指数为⼩数时,底数不能为负数,例如:25**1.5=125,(-25)**1.5=?(不成⽴) (2)取余(%) 操作数为整数,否则要截取。第⼆个数不能为0(因为除数不能为0) (3)负(-) -$a=$a*(-1)

此外,注意当⼀个字符串参加运算,需要转化为整数时,如果不能转化为整数则值为0。例如:'2'+1=3,'a'+1=12)、数字⽐较运算符

<(⼩于)、=(等于)、>(⼤于)、==(等于)、<=(⼩于等于)、>=(⼤于等于)、!=(不等于)、<=>(⽐较) (1)==:⽐较运算,⽐较的结果为真或⾮零,假或零

(2)<=>:⽐较运算 例如:$a<=>$b,当$a>$b时,值为1;当$a<$b时,值为-1;当$a==$b时,值为0 (3)⾃动把操作数转化为整数,不能转化为整数则为0

(4)浮点数不精确,不要把值相近的数⽐较,否则得到的结果是出乎意料的

3)、字符串⽐较运算符

lt(⼩于)、gt(⼤于)、eq(等于)、le(⼩于等于)、ge(⼤于等于)、ne(等于)、cmp(⽐较) (1)字符串的⽐较原则:按照字母表的顺序⽐较,数字<⼤写字母<⼩写字母(a⼩—z⼤)

(2)字符串⽐较的次序:字符串从左到右⽐较。'azz'<‘bc'(即:⾸先a与b进⾏⽐较,然后z与c进⾏⽐较) (3)当⼀个串是另⼀个的前缀时,长度长的为⼤。例如:dog '123' lt '45' (6)cmp等同于<=>,结果为-1,0, 1

例如:$str1=”a”,$str2=”a“,则print ($str1 cmp $str2) ==> 0 例如:$str1=”a”,$str2=”b”,则print($str1 cmp $str2)===> -1 例如:$str1=”b”,$str2=”a”,则print($str1 cmp $str2)===> 1 (7)空串,0,Undef,这三种情况都为假 例如:如下⽐较的结果 35 != 30+5 #假 35 == 35.0 #真

'35' eq '35.0' #假(当成字符串来⽐较) 'fred' lt 'barney' #假 'fred' lt 'free' #假 'fred' eq \"fred\" #真 'fred' eq \"Fred\" #假 ' ' gt ' ' #真

4)、字符串连接(.)、字符/字符串重复(x) (1)连接( “.“),例如:$a=‘a'.'b'; =>‘ab'

在print时可以直接写print $a$b=>print $a.$b; 但是这两者的原理是不⼀样的

(2)重复( “x” ),注意:前后有空格(⽬的:为了和变量名分开),例如:‘a' x 5=‘aaaaa',若重复次数<1,则返回空串 例如:\"5\" x 4,即为:\"5555\"

例如:\"love\" x (4+1),即为:\"lovelovelovelovelove\" 例如:\"4.8\" x 4,即为:\"4.84.84.84.8\" 例如:6.1 x 3,即为:\"6.16.16.1\"

即:左边是⼀个字符串,右边是该字符串出现的次数

5)、逻辑运算符(&&(and)(与)、||(or)(或)、!(not)(⾮)、xor(异或) (1)先算左边的值,后算右边的值

(2)&&和and的优先级不同,但除⾮特殊情况,很难有区别

6)、位操作运算符

&(按位与)、 |(按位或)、 ~(按位⾮)、 ^(按位异或)、 <<(左移)、>>(右移) (1)操作数为⼆进制整数,如果是⼩数则截取为整数

(2)<<左移,移开后空位补0,值为原数值的2*N倍(例如:z<<4,则z=z*(2的4次⽅)) (3)>>右移,⾸位补0,值为原值⼀半(并取整)(例如:z>>4,则z=z/(2的的次⽅))7)、赋值运算符

=、+=、-=、*=、/=、%=、**=、&=、|=、^=、.= (1)$a+=1=>$a=$a+1

(2)可以连等$a=$b=3;=>$a=3;$b=3;

(3)混⽤ ($a=$b)+=3;=>$a=$b;$a=$a+3;(不建议使⽤)

8)、⾃增(++)、⾃减(--)

(1)不要在变量两边都使⽤此种操作符:++$var--

(2)不要在变量⾃增/减后在同⼀表达式中再次使⽤:$var2 = $var1 + ++$var1; (3)可⽤于字符串的⾃增,当z、Z、9时进位。$a=‘caz'; $a++; ==> $a=‘cba'; (4)不能⽤于字符串的⾃减,当$a--时,按数字运算,字符先转化为0再⾃减

(5)如果字符串含有⾮字母数字符号,或数字位于字母中时,⾃增也先化为0再⾃增 例如:$a=‘ab*c'; $a++; ==> $a=1; 例如:$a=‘ab5c'; $a++; ==> $a=1;

(6)预增$b=++$a,$a先⾃增再赋值,后增$b=$a++;$a先赋值再⾃增;反之,同理 例如:$a=1; $b=++$a; =>$a=2,$b=2; 例如:$a=1; $b=$a++; =>$a=2,$b=1;

(7)只能⽤于单⼀变量,不能对运算后的变量进⾏。例如:($a+$b)++9)、逗号(相当于:将两条语句写在⼀⾏) 适⽤范围: 只有当两个语句关联紧密时才使⽤ 例如:$a+=1,$b=$a; => $a+=1; $b=$a; 例如:$a=\"ab5c\

10、条件运算符 条件? 真:假

(1)三个操作数:先对条件表达式运算,为真时执⾏:的左边的运算,为假时执⾏:的右边的运算 例如:$result = $var == 0 ? 14 : 7; (2)⽤于简单的条件

(3)条件表达式⽤在=的左边

例如:$condvar == 43 ? $var1 : $var2 = 14; 例如:$condvar == 43 ? $var1 = 14 : $var2 = 14;

三、操作符优先级别( precedence--优先级)

当⼀个表达式中出现⼏种不同的运算符,哪个先计算,哪个后计算 例如:$condvar == 43 ? $var1 : $var2 = 14;(先算条件,后算赋值) 例如:$x = $a == $b;(先算关系,后算赋值)

例如:$x == 0 || $y / $x > 5;(先算除,接着算⼤于、接着算等于,最后算关系或)

例如:$result = 11 * 2 + 6 ** 2 << 2;(先算幂,再算乘,接着算加,再接着算左移,最后算赋值)

(1)⼀般的优先级如下:⾃增⾃减最⾼,单操作数⾼于多操作数,数字运算 > ⽐较运算(数字⽐较与字符串⽐较) > 位运算> 赋值运算 > 逻辑运算 (2)数字运算:幂 > */>+-

(3)⽐较运算: <(⼩于)、>(⼤于)⾼于(== 与!=)

Perl数组变量和列表的概念,列表是包含在括号⾥的⼀序列的值,可以为任何数值,也可为空,并且列表存贮于Perl数组变量中,与简单变量不同,Perl数组变量以字符\"@\"打头。Perl数组变量和列表

⼀、列表

列表是包含在括号⾥的⼀序列的值,可以为任何数值,也可为空,如:(1,5.3,\"hello\,空列表:()。

注:只含有⼀个数值的列表(如:(43.2))与该数值本⾝(即:43.2)是不同的,但它们可以互相转化或赋值。列表例:(17,$var,\"astring\")(17,26<<2)(17,$var1+$var2)

($value,\"Theansweris$value\")⼆、Perl数组--列表的存贮

列表存贮于Perl数组变量中,与简单变量不同,Perl数组变量以字符\"@\"打头,如:@array=(1,2,3);注:

(1)Perl数组变量创建时初始值为空列表:()。

(2)因为PERL⽤@和$来区分Perl数组变量和简单变量,所以同⼀个名字可以同时⽤于Perl数组变量和简单变量,如:$var=1;

@var=(11,27.1,\"astring\");但这样很容易混淆,故不推荐。1、Perl数组的存取

◆对Perl数组中的值通过下标存取,第⼀个元素下标为0。试图访问不存在的Perl数组元素,则结果为NULL,但如果给超出Perl数组⼤⼩的元素赋值,则Perl数组⾃动增长,原来没有的元素值为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,\"\◆Perl数组间拷贝@result=@original;◆⽤Perl数组给列表赋值@list1=(2,3,4);

@list2=(1,@list1,5);#@list2=(1,2,3,4,5)◆Perl数组对简单变量的赋值

(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]\"为Perl数组@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\@day_of_month=(\"01\"..\"31\")◆可包含变量或表达式($var1..$var2+5)◆⼩技巧:$fred=\"Fred\";

print((\"Hello,\".$fred.\"!\\n\")x2);其结果为:Hello,Fred!Hello,Fred!

4、Perl数组的输出:(1)@array=(1,2,3);print(@array,\"\\n\");结果为:123

(2)@array=(1,2,3);print(\"@array\\n\");结果为:123

5、列表/Perl数组的长度

当Perl数组变量出现在预期简单变量出现的地⽅,则PERL解释器取其长度。@array=(1,2,3);

$scalar=@array;#$scalar=3,即@array的长度

($scalar)=@array;#$scalar=1,即@array第⼀个元素的值注:以Perl数组的长度为循环次数可如下编程:$count=1;

while($count<=@array){

print(\"element$count:$array[$count-1]\\n\");$count++;}

6、⼦Perl数组@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\@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,\"\可以⽤⼦Perl数组形式来交换元素:@array[1,2]=@array[2,1];7、有关Perl数组的库函数(1)sort--按字符顺序排序@array=(\"this\

@array2=sort(@array);#@array2=(\"a\@array=(70,100,8);

@array=sort(@array);#@array=(100,70,8)now(2)reverse--反转Perl数组@array2=reverse(@array);@array2=reversesort(@array);(3)chop--Perl数组去尾

chop的意义是去掉STDIN(键盘)输⼊字符串时最后⼀个字符--换⾏符。⽽如果它作⽤到Perl数组上,则将Perl数组中每⼀个元素都做如此处理。

@list=(\"rabbit\

chop(@list);#@list=(\"rabbi\(4)join/split--连接/拆分

join的第⼀个参数是连接所⽤的中间字符,其余则为待连接的字符Perl数组。$string=join(\"\结果为\"thisisastring\"@list=(\"words\

$string=join(\"::\结果为\"words::and::colons\"@array=split(/::/,$string);#@array=(\"words\

perl hash 常见⽤法 基本⽤法

# 初始化 %h为空数组%h = {};# ⽤数组初始化%h为 a=>1, b=>2%h = ('a', 1, 'b', 2);# 意义同上,只是另⼀种更形象化的写法。%h = ('a'=>1, 'b'=>2);#如果key是字符串,可以省略引号。下⾯这⾏和上⾯那⾏是⼀样的%h = (a=>1, b=>2);# ⽤{}来访问print"$h{a}\\n"; # 打印1$h{b} = '2b';print "$h{b}\\n"; # 打印2b# 删除key⽤deletedelete $h{b}; # 从$h删除'b' 清空hash undef %h

得到hash的所有键值

# 得到所有keys,顺序取决于hash函数,或者说是乱序 @all_keys = keys %h;

# 所有键值,是按hash的值从⼤往⼩排列的。值的⽐较是数字⽐较(⽐如说,10>9) @all_keys = sort{$h{$b}<=>$h{$a}} (keys %h);

# 所有键值,是按hash的值从⼩往⼤排列的。值的⽐较是数字⽐较 @all_keys = sort{$h{$a}<=>$h{$b}} (keys %h);

# 所有键值,是按hash的值从⼩往⼤排列的。值的⽐较是字符串⽐较(⽐如说,'10' < '9') @all_keys = sort{$h{$a} cmp $h{$b}} (keys %h);判断hash是否包含key exists($h{$key});

Hash的长度

想要知道⼀个hash存放多少数据 $hash_size = keys %h

# 把%h的长度放到$hash_size中 print scalar kes %h, "\\n"

# 打印%h的长度。这⾥⽤了scalar来返回数组长度。

遍历⼀个hash

while (my ($k, $v) = each %h) {print "$k ---> $v\\n";}Reference引⽤

Reference类似于C/C++的指针 $h_ref = \\%h;

# 获得⼀个hash的reference%aHash = %{$h_ref};

# 把hash reference当成hash⽤$value = $h_ref->{akey} # 这个和%h{akey}是⼀样的传递hash到函数

⼀般都是传递⼀个reference到函数

%h = ();$h{a}=1;foo(\\%h)print $h{b}, "\\n"; # 打印出2。

这个值来⾃于函数foo() sub foo {my ($h) = @_;print $h->{a}, "\\n"; # 打印出1$h->{b} = 2;}

函数返回hash,或者hash引⽤(hash reference) 函数可以返回hash

sub foo {my %fh;$fh{a} = 1;return %h;} my %h = foo();print

Perl的条件控制叙述和C语⾔很像,让使⽤者很快就能掌握它。不过Perl⽐C语⾔⼜另外多了些实⽤的语法,我⽤底线标出来,⼤家⼀看便知。

# Expression 就是条件叙述式,Perl和C⼀样没有定义布尔数据型态(Boolean datatype), # 因此 0 是false、⾮0 是ture。另外要注意字符串运算⼦和数值运算⼦要分清楚哦。 # Code Segment 就是⽤⼤括号括起来的⼀堆指令,也就是⼀个Block。 if (Expression) {Code Segment}

if (Expression) {Code Segment} else {Code Segment}

if (Expression) {Code Segment} elsif (Expression) {Code Segment} else {CodeSegment} # elsif 就是 else if

# 如果指令(statement)只有⼀项,我们可以使⽤倒装句法,看起来⽐较简洁。 statement if (Expression); # unless 就是if not

statement unless (Expression);例: print \"HELLO!\\n\" if ($name eq \"friend\"); $x-=10 if ($x == 100);

看吧! C 语⾔有的Perl⼤部分都有,学过 C 的⼈可以毫不费⼒的学会Perl。

Perl的循环控制叙述也和C语⾔很像,当然,照例Perl也另外多了些实⽤的语法: # 注意:纯量变数前⾯要加个 $ 字号,这⼀点和C语⾔不⼀样哦。 for($i=0; $i<=10; $i++) {Code Segment}

# foreach 是承袭UNIX的shell script来的,

# 第⼀个⾃变量是纯量变数,第⼆个⾃变量要⽤括号括起来,⾥⾯是⼀个纯量数组, # 顾名思义它就是把数组中的每个元素依序传给第⼀个⾃变量,直到全部传完。

# 它和 for($i=0; $i<=$#array; $i++) ⽤法虽然不同,但⽬的都是要取出数组的每个元素。 foreach $i (@array) {Code Segment}

# 其实在Perl中,for和foreach是可以混着⽤的,就看个的⼈习惯了。

# 下⾯这⾏就等于上⾯第⼀个叙述,不过简洁多了,⼤家可以试着⽤⽤看。 for $i (0..10) {Code Segment}

# while控制循环和后置循环。 while($i<=10) {Code Segment}

do {Code Segment} while(Expression);

# Perl也有和C语⾔的break和continue⼀样的指令,Perl叫它做 last 和 next (较⼝语化)。 # last是跳出现在所在的循环,next则是跳过下⾯的指令直接执⾏下⼀次的循环。 while(chomp($i=)) { next if ($i == 5);

last unless ($i > 10); }

Perl 还有提供label(标记)的语法,也就是goto 指令,不过有经验的programer并不喜欢⽤它,我也不建议⼤家使⽤,所以就此按下不讲。有兴趣的⼈请⾃⾏查阅。还有⼀点值得注意的是Perl没有提供像C语⾔⼀样的 switch 叙述,不过Perl的patternmatch的功能⾮常强,所以我建议你直接⽤ if else 叙述来做就好了。

(a) Syntax: sub NAME {Code}

(b) 呼叫⼦程序: &NAME(para1, para2,...) (c) 参数传递:@_

Perl 和C⼀样是采⽤Call by value的⽅式,不过因为Perl不⽤事先宣告变量,所以建⽴⼦程序的时候也不⽤宣告要传递什么参数。当主程序在传递参数给⼦程序时,Perl会把括号括起来的参数按顺序放在⼀个特殊的全域变量 @_ 数组中,然后⼦程序就可以随意使⽤数组 @_ ⾥的参数,例如 $_[0] 是第⼀个参数, $_[1] 是第⼆个,或是⽤ my($a1,$a2,$a3,...) = @_;来取出各个参数,当然 my @arg=@_; 或 my %arg=@_; 也是可以的。由于Perl的语法⾮常活泼,使得程序在维护时特别棘⼿,因此写批注成为⼀项很重要的⼯作。我建议你最好在每个⼦程序前⾯加上对这段⼦程序的描述,特别是需要传递的参数要注明清楚。 (d) Variable Localization:my or local

通常我们在程序中定义的变量都是全域变量,所以在⼦程序中若要把变量区域化则要加上 my 或 local 关键词,例如:my

$x=3;,若⼦程序所⽤的变量名不⼩⼼和主程相同,Perl会以⽬前正在执⾏的⼦程序⾥的变量为优先。

(a) Syntax:

open(FILEHANDLE,\"Expression\"); close(FILEHANDLE);

这⾥的Expression是⼀个叙述加上⽂件名称,若Expression只有⽂件名称没有加上叙述,则预设是只读。Expressions叙述如下:

Expression Effect open(FH, \" filename\") open(FH, \"+filename\")

open(FH, \">filename\") Opens filename for writing.

open(FH, \"+>filename\") Opens filename for both reading and writing. open(FH, \">>filename\") Appends to filename.

open(FH, \"command|\") Runs the command and pipes its output to thefilehandle. open(FH, \"command|\") Pipes the output along the filehandle to thecommand. open(FH, \"-\") Opens STDIN. open(FH, \">-\") Opens STDOUT.

open(FH, \"<&=N\") Where N is a number, this performs the equivalent of C'sfdopen for reading. open(FH, \">&=N\") Where N is a number, this performs the equivalent of C'sfdopen for writing. 例:

# 开启$filename这个档案,若开启失败则印出die后⾯的讯息,并结束程序。 open(FILE, $filename) || die \"Can't open file $filename : $!\\n\";# 下⾯是⼀个⼗分精简的写法,和 while($_=){print \"$_\";} 是等效的。 print while();

# 档案开启后要记得随⼿关闭,这才是写程序的好习惯。 close(FILE);

# $!和$_都是Perl的特殊变数,下⾯会介绍的。

(b) Input:

Perl没有特别⽤来输⼊的函数,因为Perl在执⾏程序时,会⾃动开启标准输⼊装置,其filehandle定为STDIN,所以在Perl中要输⼊数据的⽅法就是使⽤:

# Perl不会⾃动去掉结尾的CR/LF,跟C语⾔不同,所以要⽤chomp函数帮你去掉它。 # ⼤家常常会忘记这个动作,导致结果跟你想的不⼀样,要特别注意⼀下。 $input=; chomp $input; # 下⾯是较简洁的写法。 chomp($input=);

(c) Output:print \"variables or 字符串\";

Perl也有printf()函数,语法和C语⾔⼀模⼀样,我就不多做介绍了。Perl另外有个print函数,⽐printf()更⽅便、更好⽤,包你爱不释⼿。Output不外乎是输出到屏幕或档案,⽤例⼦来说明⽐较容易了解。# 不⽤再指定变量的data type,这样不是⽐printf()⽅便多了吗? print \"Scalar value is $x\\n\";

# . 是字符串加法的运算⼦,上下这两⾏是等效的。 print \"Scalar value is \" . $x . \"\\n\";# 输出到档案的⽅法。

print FILE \"print $x to a file.\";

# 下⾯是print的特殊⽤法,学⾃shell script的⽤法: print这招叫做 here document,XXX可以是你取的任何标识符,在标识符之间的字都会按照你所写的样⼦输出,就像\\标签⼀样。⽽当⼀⾏的开头是XXX你取的这个标识符时,才会停⽌输出。 XXX

Perl 也有和 C ⼀样以 \"\\\" 开头的特殊字符: \ tab

\\n newline

\\r return \\f form feed \\b backspace \\a alarm(bell) \\e escape \\033 octalchar 1b hex char \\c[ control char

\\l lowercase next char \uppercase next char \\L lowercase till \\E \\U uppercase till \\E

\\E end case modification

\\Q quoteregexp metacharacters till \\E

另外需要说明的是 Perl 融合了unix shell script的使⽤惯例,以双引号(\"\")括起来的字符串会先经过展开,但反斜线(\\)后⾯的字符则不展开,当作⼀般字符看待。⽽以单引号('')括起来的字符串完全不会展开,以反单引号(``)括起来的字符串会把它当作命令列指令⼀样执⾏,等于system()⼀样。初学者常常会搞混,但习惯之后就会觉得不这样分清楚反⽽不⾏哩,举个例吧: $x=\"ls -l\";

print \"$x\"; # Output ls -l print \"\\$x\"; # Output $x print '$x'; # Output $x

print `$x`; # Output files in this directory1. Perl函数 通过 & 调⽤.

2. Perl参数

Perl天然⽀持可变数⽬个参数。

在函数内部,所有参数按顺序放在数组 @_ 中,在函数内部,$_[0] 表⽰函数的第⼀个参数,其余类推。

3. shift

shift 后跟⼀个数组,表⽰将数组的第⼀个值返回。数组也被改变,其第⼀个元素被弹出。

演⽰代码⼀(求最⼤值): #!/usr/bin/perl -w use strict;

# 调⽤函数max,取得⼀组数值的最⼤值,并输出。 my $maxCnt = &max(11,22,33); print \"maxCnt=$maxCnt\\n\";

sub max {

# 采⽤遍历算法。先将参数中的第⼀个值赋给$currentMaxCnt。 # @_ 是默认的包含本函数所有参数 [如(11,22,33)]的数组。

# shift @_ 有两个结果: 1. 将数组 @_ 中的第⼀个值做为返回值(赋给了$currentMaxCnt). 2. 将@_数组第⼀个值弹出[此后@_的值变为(22,33)]. my $currentMaxCnt = shift @_;

# 函数中使⽤shift时,@_可以省略。上⾯代码也可以写成这样。 # my $currentMaxCnt = shift;

# 遍历整个@_数组。 foreach ( @_ ) {

# $_ 表⽰数组@_中当前被遍历到的元素. if ( $_ > $currentMaxCnt ) {

# 如果发现当前数组元素⽐$currentMaxCnt⼤,那就将$currentMaxCnt重新赋值为当前元素。

$currentMaxCnt = $_;

} }

# 函数返回值为标量$currentMaxCnt. return $currentMaxCnt; }

演⽰代码⼆(求和): #!/usr/bin/perl -w use strict;

# 求⼀组数的和并打印。

my $s1 = &sumvar(11,22,33); my $s2 = &sumarg(22,33,44);

my $s3 = &sumgod(11,22,33,44,55); print \"s1=$s1, s2=$s2, s3=$s3\\n\";

# 办法1

sub sumvar {

# 将参数数组的前三个元素值相应地赋给($first, $second, $third) (my $first, my $second, my $third) = @_;

# 返回其和值。缺点: 如果是求四个参数的和,依然只能给出前三个的和。 return $first + $second + $third; }

# 办法2

sub sumarg {

# $_[0] 表⽰参数数组@_的第⼀个元素。其余类推。 my $first = $_[0]; my $second = $_[1]; my $third = $_[2];

# 返回其和值。缺点: 同sumvar. 只是通过这⾥学习 $_[0] 这种⽤法。 return $first + $second + $third; }

# 办法3, 参数可以任意多。都能求其和。 sub sumgod{ my $s = shift @_; foreach ( @_ ) { $s = $s + $_; }

# 同前⾯函数max。 return $s; }

整理了⼀下⾃⼰觉得⽤的⽐较多的⼀些符号、⽤法、函数、库之类的,这些都是很基本的,但是“背熟”了,对提⾼效率会很有帮助。

数据操作

* $ - 声明与引⽤⽤⼀个scalar的变量

* @ - 声明与引⽤⼀个list,但是当访问⼀个list的成员时,需使⽤$ListName[index] * % - 声明与引⽤⼀个hash表,但是当访问⼀个hash的成员时,需要使⽤$HashName{key}

特殊变量

* $0 - 当前运⾏脚本的⽂件名

* @ARGV - 当前运⾏脚本的命令⾏参数列表 * $_ - 默认变量,如循环中的当前变量 * @_ - 函数的输⼊参数列表 * %ENV - 系统的环境变量

* @INC - Perl的Include路径列表,我们可以往该列表中添加我们⾃⼰的⽬录来⽅便引

⽤⾃定义的库

* $! - 当前系统提⽰,错误信息 * $^O - 操作系统的名字

* STDIN,STDOUT,STDERR - 输⼊输出的默认句柄,可以作⼀定的⾃定义 * => - 声明⼀个hash时可以⽤来明确的表⽰出key=>value的对应关系

* $^I- 指定备份的⽂件的后缀名,如此,被修改的⽂件将会⾃动以该后缀名保存⼀个副本

特殊⽤法

* &Sub - 调⽤⼀个函数,虽然Perl有些规则让你在某些时候可以省略这⾥的&符号,但是处于⼀致性考虑,所以⾃定义的函数的调⽤,我⼀律采⽤此种⽅式。

* $# - ⽤来取得模个数组的最⼤index, ⼀般情况下,也可以⽤-1来表⽰最后⼀个元素的index的

* qw() - 快速声明⼀个字符串数组,可以省略那些烦⼈的引号正则表达式

* $ - 获取被括号捕获的匹配

* $`, $&, $' - 获取匹配的字符串,以及其前后两个部分 * ^,$ - 字符串的始末位置,⽤作定位

常⽤函数

* pop, push, shift, unshift, reverse - list的操作函数

* keys,values, exists, each, delete - hash的操作函数 * chomp, split, join, index, substr, sort - 字符串操作函数 * sprintf,printf, print - 格式化输出函数 * system, exec, `` - 系统命令调⽤函数

* glob, unlink, mkdir, rmdir, rename,chmod,chown, open, close, opendir,closedir - ⽂件系统操作函数

* stat, lstat,localtime,gmtime,utime - ⽂档属性,时间相关函数 * hex, oct - ⼆进制,⼋进制,⼗六进制数转化成⼗进制的函数 * grep, map - list⾼级操作函数

这些函数的详细介绍,都可以通过命令: #perldoc -f functionname 查到

常⽤库

* File::Basename - 根据path获取⽂件名或者⽂件路径 * File::Spec - 根据⽂件名与路径组合成全路经 * File::Find - 递归遍历某个⽬录下所有⽂件

* XML::Simple - 以⼀个复杂的结构来表⽰xml⽂件,使⽤起来相当⽅便 * Time::HiRes - 经常⽤来计算⼀个操作所耗费的时间

* Getopt::Long - 当脚本需要复杂的输⼊参数与选项时⽤到 * Cwd - 拿到当前⼯作⽬录 * IO::File - ⽂件操作

* Win32 - 当需要调⽤⼀些Windows API时我会⽤它

因篇幅问题不能全部显示,请点此查看更多更全内容

Copyright © 2019- ovod.cn 版权所有

违法及侵权请联系:TEL:199 1889 7713 E-MAIL:2724546146@qq.com

本站由北京市万商天勤律师事务所王兴未律师提供法律服务