Perl简介(适合对C语言有点认识的读者)
2006-03-05 11:28:15 来源:WEB开发网核心提示:###版权声明本篇文章的版权为作者PinHongChen先生所有.允许网路上的非营利##转载.作者的电子邮件地址:honger.bbs@aidebbs.edu.tw本文可在下列URL取得:##http://www.math.ncu.edu.tw/~chenym/perl/intro.html###Fromnews.nc
##########################################################################
#版权声明#
##
#本篇文章的版权为作者PinHongChen先生所有.允许网路上的非营利#
#转载.作者的电子邮件地址:honger.bbs@aidebbs.edu.tw#
##
#本文可在下列URL取得:#
#http://www.math.ncu.edu.tw/~chenym/perl/intro.html#
##########################################################################
Fromnews.ncu.edu.tw!news.cc.nctu.edu.tw!news.csie.nctu.edu.tw!aide_boardWedFeb1423:57:101996
Path:news.ncu.edu.tw!news.cc.nctu.edu.tw!news.csie.nctu.edu.tw!aide_board
From:honger.bbs@aidebbs.edu.tw(HerDoneMineChao!)
Newsgroups:tw.bbs.comp.www
Subject:BasicIntroductiontoPerl
Date:13Feb199606:54:46GMT
Organization:湾学术网路BBS实验站
Message-ID:<3BCREM$5jj@aidebbs.edu.tw>
X-Filename:www/M.824194486.A
NNTP-Posting-Host:eo4.ee.ntu.edu.tw
Lines:307
这是小弟的一篇介绍perl的文章,希望对你有用:
:)
Honger
PPPPEEEEERRRRL
PPERRL
PPPPEEEERRRRL
PERRL
PEEEEERRLLLLLL
1.Introduction
这不是perl的完整介绍,只是想将perl向CPRogrammer作个介绍,也许能
有所帮助!
perl是由LarryWall先生所写.目前的版本5.002,加入多项的功能.请
看perl.1,那有详细的条列.
一般而言,由awk,sed,shellprogramming写的东西可以轻易用perl来
处理,而且速度更快.在Cprogram中,特别是有关抽取文字档中的资讯,加以转化
处理,用perl写会更加方便,而且不用处处担心pointer和memoryallocation
的问题.当然了,perl执行时会有一道转成内部表示式的关,真正optimized
过的Ccode仍会比perlcode快.一般而言,perlcode会比Ccode短很多.
perl在regularexpression,list(array)和associativearray有很方
便的语法和不错的执行效率.连yacc(Berkeleyyacc)也可有产生perlcode的
选项,这对於prototyping十分方便.
2.PerlBasics
2.1BasicdatastructureandControlconstruct
perl的comment是从#之後开始.而perl并不区分string
,integer和floatpointnumber的datatype,统统以纯量代表.例如:
#Thisisacommentlinetilltheendofthisline
$x=1.5;
$y="Ihateshellprogramming";
$z=1.3e-27;
这个$是表示现在操作的是个纯量(相对於list或associativearray).
在C里的Operator,如 ,-,*,/,,^, ,--, =,-=,*=,/=,=,==,!=,&&,
||,|,&全都有,意思也不变.不过若用於字串,.(dot)是表示连接的意思.
因此.=也有类似C中 =的意思.
$x='Ihate';
$x.="awkprogramming.";
print$x;
结果为Ihateawkprogramming.字串可用单或双括号围住.超出一行也没关.
也可以写的像shellprogramming中:
$x=< Thispartcanbeputwhat
youlikehere
1234567890
tillthesignasthebeginning.
END
相当於
$x="Thispartcanbeputwhat
youlikehere
1234567890
tillthesignasthebeginning.";
字串的比较有eq,ne,gt,lt,....就像那Fortran的operator.聪明的
你猜猜就知道啦.
至於control方面,如if,while,do..while,都和C类似.如:
$sum=0;
for($i=0;$i<10;$i ){
$sum =$i;
}
大括号是不可省略的!这和C不同.也可:
$sum=0;
$i=0;
while($i<10){
$sum =$i ;
}
如果你要从loop中跳出来,last相当於C中break,next相当於continue.
$sum=0;
$i=0;
while($i<10){
if($i2==0){
$sum =$i ;
next;
}elsif($sum>50){
last;
}
}
if叙述要注意大括号是不可省,还有elseif必须写成elsif.
2.2List
List和1dimensionarray在perl中没区别.用法如:
@a=(1,2,3);
$a[0]-=$a[1];
print"a[0]=$a[0]";
结果就是a[0]=-1.@是表示现在在操作list.双括号的字串中,若有变数,perl
会直接解译.如上例中的$a[0].List可以直接连接:
@a=(1,2,3);
@b=(4,5);
@c=(@a,@b,6,7);
print"@c";
结果是1234567.perl有特殊的变数,$#a来表示@a的最後index,
所以上例中,$c[$#c]就是7,也可写成$c[-1].那麽$c[-2]就是6了.
List还有些operator,push,pop,shift,unshift,splice,其中
push推一些元素入list:
@a=(1,2);
push@a,(3,4);
结果@a成为(1,2,3,4).
pop拉最後一个元素:
@a=(1,2,3);
$b=pop@a;
结果@a成为(1,2),$b变成3.
shift,unshift和pop,push类似不过操作在list前端.
@a=(1,2,3);
$b=shift@a;
unshift@a,0;
结果@a成为(0,2,3),$b变成1.
Loop也可写成:
@weekday=('Mon','Tue','Wed','Thu','Fri','Sat');
foreach$x(@weekday){
#schedulesomething
}
结果$x会依序变成'Mon','Tue','Wed','Thu','Fri','Sat'等.
2.3AssociativeArray
这是使用string来做index的array,一般叫作hash.
$phone_no{'peter'}='02-9110238';
$phone_no{'john'}="06-1234567";
$name='peter';
print"$namePhoneNo.=",$phone_no{$name},"\n";
结果就会印一行:
peterPhoneNo.=02-9110238
上面两行也可写成:
phone_no=('peter'=>'02-9110238','john'=>'06-1234567');
=>和,一样所以:
phone_no=('peter','02-9110238','john','06-1234567');
也可,就是相当於一个key和value,所组成的list.
2.4Subroutine
副程式可以任意摆放,perl全看得到.
subfoo{
my$x=$_[0];
my$y=$_[1];
return$x/$y;
}
$x=1;
$y=8;
printfoo(4,2);
结果是2.
上例中,my这个keyWord表示,$x,$y是在foo围内有效(localvariable
insubroutinelexicalscope).而$_[0],$_[1]用於传参数.perl的subroutine
呼叫参数都是放在固定@_的list中.
2.5SpecialVariables
perl常使用的defaultvariable是$_.
@weekday=('Mon','Tue','Wed','Thu','Fri','Sat');
foreach(@weekday){
#dowith$_
}
结果$_会依序变成'Mon','Tue','Wed','Thu','Fri','Sat'等.
@ARGV是perl执行时的commandlineargument,$ARGV[0]相当於C中的
argv[1].$ARGV[1]相当於C中的argv[2].C中的argv[0]放在$0.
ENV是perl执行时的environmentvariable,$ENV{'HOME'}就是user
的homepath,$ENV{'PWD'}就是currentpath.
其它特殊变数请参考perlvar.1.
2.6FileHandle
perl中主要开档的方法:
open(FH,"test.dat");#写入
open(FH,"greppetertest.dat|");#先经greppetertest.dat处理後的pipe资料
open(FH,"|more");#後经more处理写出的资料
$oneLine=;#读取FH
printFH"1234";#写入FH
close(FH);#关档
例子:
open(FH,"test.dat");#相当於open(FH,"){
printf"M:s", $n,$_;
}
close(FH);
结果会把test.dat加4位行号印出.(只写时相当於省略$_=).
2.7RegularExpression
perl对於regularexpression有重新改写.好用且功能强,是sed和awk的
superset.要求执行regularexpression比对的operator为~=(match),
!=(notmatch).regularexpression用/.../括住.
$line="end;";
if($line=~/end/){
print"match!";
}else{
print"NO!";
}
结果会印出match!,如果改成
if($line=~/^end/){
print"match!";
}else{
print"NO!";
}
结果会印出NO!
一般而言,
^表string的开端,
$表string的结束,
[a-z]表a到z中任一字元
pat1|pat2表pat1或pat2皆可
x*表x重0次或以上
x 表x重1次或以上
\d相当於[0123456789],\D就是相反
\w相当於[_a-zA-Z0-9],\W就是相反
\s表示space,\S表非spacecharacter
若要取代,则:
$d="Sep.15th,Sep.17th";
$a=~s/Sep/9/;
结果是9.15th,Sep.17th,加g(global)option如下:
$d="Sep.15th,Sep.17th";
$a=~s/Sep/9/g;
结果是9.15th,9.17th.另外i(case-insensitive)option可不管大小写.
2.8Reference
Perl5.0之後允许listoflist也就可能有2-DimensionArray.
例如:
$a[0][0]=1;
$phone{$name}[0]='1234';
$phone{$name}[1]='2674';
实际上是用所谓的reference,就像是C的address.一个纯量可纯存一个
reference.
@a=(1,2,3);
$aref=\@a;#取@a的reference
print$aref->[0];#相当於print$a[0];
push@{$aref},4;#相当於push@a,4;
2-dimensionarray可以如:
@a=([1,2,3],[4,5,6]);
print$a[1][2];
结果是6.
使用associativearray也类似:
$database{$name}{'home'}{'address'}='No.1234,75thStreet";
$database{$name}{'office'}{'phone'}='02-8127365";
Listofassociativearray也都可以使用.
2.9Example
Email中若有uuencode的资料,可以写perl将它extract出来.
#!/usr/local/bin/perl
open(EMAIL,"<$ARGV[0]")||die"Cannotopen$ARGV[0]:$!";
#若开不成perl会跳出且印Cannotopen...
while(){
if(/^begin\s \d\d\d\s /){
#遇到begin开头後印出
print$_;
while(){
if(/^end/){
#遇到end时结述
last;
}
print$_;
}
print$_;
last;
}
}
close(EMAIL);
可以写得更简化,不过那就属於您功力的无限空间了.........
-----ByPinhongChen--------------------------------------------------------
V1.0Feb11,1996
#版权声明#
##
#本篇文章的版权为作者PinHongChen先生所有.允许网路上的非营利#
#转载.作者的电子邮件地址:honger.bbs@aidebbs.edu.tw#
##
#本文可在下列URL取得:#
#http://www.math.ncu.edu.tw/~chenym/perl/intro.html#
##########################################################################
Fromnews.ncu.edu.tw!news.cc.nctu.edu.tw!news.csie.nctu.edu.tw!aide_boardWedFeb1423:57:101996
Path:news.ncu.edu.tw!news.cc.nctu.edu.tw!news.csie.nctu.edu.tw!aide_board
From:honger.bbs@aidebbs.edu.tw(HerDoneMineChao!)
Newsgroups:tw.bbs.comp.www
Subject:BasicIntroductiontoPerl
Date:13Feb199606:54:46GMT
Organization:湾学术网路BBS实验站
Message-ID:<3BCREM$5jj@aidebbs.edu.tw>
X-Filename:www/M.824194486.A
NNTP-Posting-Host:eo4.ee.ntu.edu.tw
Lines:307
这是小弟的一篇介绍perl的文章,希望对你有用:
:)
Honger
PPPPEEEEERRRRL
PPERRL
PPPPEEEERRRRL
PERRL
PEEEEERRLLLLLL
1.Introduction
这不是perl的完整介绍,只是想将perl向CPRogrammer作个介绍,也许能
有所帮助!
perl是由LarryWall先生所写.目前的版本5.002,加入多项的功能.请
看perl.1,那有详细的条列.
一般而言,由awk,sed,shellprogramming写的东西可以轻易用perl来
处理,而且速度更快.在Cprogram中,特别是有关抽取文字档中的资讯,加以转化
处理,用perl写会更加方便,而且不用处处担心pointer和memoryallocation
的问题.当然了,perl执行时会有一道转成内部表示式的关,真正optimized
过的Ccode仍会比perlcode快.一般而言,perlcode会比Ccode短很多.
perl在regularexpression,list(array)和associativearray有很方
便的语法和不错的执行效率.连yacc(Berkeleyyacc)也可有产生perlcode的
选项,这对於prototyping十分方便.
2.PerlBasics
2.1BasicdatastructureandControlconstruct
perl的comment是从#之後开始.而perl并不区分string
,integer和floatpointnumber的datatype,统统以纯量代表.例如:
#Thisisacommentlinetilltheendofthisline
$x=1.5;
$y="Ihateshellprogramming";
$z=1.3e-27;
这个$是表示现在操作的是个纯量(相对於list或associativearray).
在C里的Operator,如 ,-,*,/,,^, ,--, =,-=,*=,/=,=,==,!=,&&,
||,|,&全都有,意思也不变.不过若用於字串,.(dot)是表示连接的意思.
因此.=也有类似C中 =的意思.
$x='Ihate';
$x.="awkprogramming.";
print$x;
结果为Ihateawkprogramming.字串可用单或双括号围住.超出一行也没关.
也可以写的像shellprogramming中:
$x=<
youlikehere
1234567890
tillthesignasthebeginning.
END
相当於
$x="Thispartcanbeputwhat
youlikehere
1234567890
tillthesignasthebeginning.";
字串的比较有eq,ne,gt,lt,....就像那Fortran的operator.聪明的
你猜猜就知道啦.
至於control方面,如if,while,do..while,都和C类似.如:
$sum=0;
for($i=0;$i<10;$i ){
$sum =$i;
}
大括号是不可省略的!这和C不同.也可:
$sum=0;
$i=0;
while($i<10){
$sum =$i ;
}
如果你要从loop中跳出来,last相当於C中break,next相当於continue.
$sum=0;
$i=0;
while($i<10){
if($i2==0){
$sum =$i ;
next;
}elsif($sum>50){
last;
}
}
if叙述要注意大括号是不可省,还有elseif必须写成elsif.
2.2List
List和1dimensionarray在perl中没区别.用法如:
@a=(1,2,3);
$a[0]-=$a[1];
print"a[0]=$a[0]";
结果就是a[0]=-1.@是表示现在在操作list.双括号的字串中,若有变数,perl
会直接解译.如上例中的$a[0].List可以直接连接:
@a=(1,2,3);
@b=(4,5);
@c=(@a,@b,6,7);
print"@c";
结果是1234567.perl有特殊的变数,$#a来表示@a的最後index,
所以上例中,$c[$#c]就是7,也可写成$c[-1].那麽$c[-2]就是6了.
List还有些operator,push,pop,shift,unshift,splice,其中
push推一些元素入list:
@a=(1,2);
push@a,(3,4);
结果@a成为(1,2,3,4).
pop拉最後一个元素:
@a=(1,2,3);
$b=pop@a;
结果@a成为(1,2),$b变成3.
shift,unshift和pop,push类似不过操作在list前端.
@a=(1,2,3);
$b=shift@a;
unshift@a,0;
结果@a成为(0,2,3),$b变成1.
Loop也可写成:
@weekday=('Mon','Tue','Wed','Thu','Fri','Sat');
foreach$x(@weekday){
#schedulesomething
}
结果$x会依序变成'Mon','Tue','Wed','Thu','Fri','Sat'等.
2.3AssociativeArray
这是使用string来做index的array,一般叫作hash.
$phone_no{'peter'}='02-9110238';
$phone_no{'john'}="06-1234567";
$name='peter';
print"$namePhoneNo.=",$phone_no{$name},"\n";
结果就会印一行:
peterPhoneNo.=02-9110238
上面两行也可写成:
phone_no=('peter'=>'02-9110238','john'=>'06-1234567');
=>和,一样所以:
phone_no=('peter','02-9110238','john','06-1234567');
也可,就是相当於一个key和value,所组成的list.
2.4Subroutine
副程式可以任意摆放,perl全看得到.
subfoo{
my$x=$_[0];
my$y=$_[1];
return$x/$y;
}
$x=1;
$y=8;
printfoo(4,2);
结果是2.
上例中,my这个keyWord表示,$x,$y是在foo围内有效(localvariable
insubroutinelexicalscope).而$_[0],$_[1]用於传参数.perl的subroutine
呼叫参数都是放在固定@_的list中.
2.5SpecialVariables
perl常使用的defaultvariable是$_.
@weekday=('Mon','Tue','Wed','Thu','Fri','Sat');
foreach(@weekday){
#dowith$_
}
结果$_会依序变成'Mon','Tue','Wed','Thu','Fri','Sat'等.
@ARGV是perl执行时的commandlineargument,$ARGV[0]相当於C中的
argv[1].$ARGV[1]相当於C中的argv[2].C中的argv[0]放在$0.
ENV是perl执行时的environmentvariable,$ENV{'HOME'}就是user
的homepath,$ENV{'PWD'}就是currentpath.
其它特殊变数请参考perlvar.1.
2.6FileHandle
perl中主要开档的方法:
open(FH,"test.dat");#写入
open(FH,"greppetertest.dat|");#先经greppetertest.dat处理後的pipe资料
open(FH,"|more");#後经more处理写出的资料
$oneLine=;#读取FH
printFH"1234";#写入FH
close(FH);#关档
例子:
open(FH,"test.dat");#相当於open(FH,"){
printf"M:s", $n,$_;
}
close(FH);
结果会把test.dat加4位行号印出.(只写时相当於省略$_=).
2.7RegularExpression
perl对於regularexpression有重新改写.好用且功能强,是sed和awk的
superset.要求执行regularexpression比对的operator为~=(match),
!=(notmatch).regularexpression用/.../括住.
$line="end;";
if($line=~/end/){
print"match!";
}else{
print"NO!";
}
结果会印出match!,如果改成
if($line=~/^end/){
print"match!";
}else{
print"NO!";
}
结果会印出NO!
一般而言,
^表string的开端,
$表string的结束,
[a-z]表a到z中任一字元
pat1|pat2表pat1或pat2皆可
x*表x重0次或以上
x 表x重1次或以上
\d相当於[0123456789],\D就是相反
\w相当於[_a-zA-Z0-9],\W就是相反
\s表示space,\S表非spacecharacter
若要取代,则:
$d="Sep.15th,Sep.17th";
$a=~s/Sep/9/;
结果是9.15th,Sep.17th,加g(global)option如下:
$d="Sep.15th,Sep.17th";
$a=~s/Sep/9/g;
结果是9.15th,9.17th.另外i(case-insensitive)option可不管大小写.
2.8Reference
Perl5.0之後允许listoflist也就可能有2-DimensionArray.
例如:
$a[0][0]=1;
$phone{$name}[0]='1234';
$phone{$name}[1]='2674';
实际上是用所谓的reference,就像是C的address.一个纯量可纯存一个
reference.
@a=(1,2,3);
$aref=\@a;#取@a的reference
print$aref->[0];#相当於print$a[0];
push@{$aref},4;#相当於push@a,4;
2-dimensionarray可以如:
@a=([1,2,3],[4,5,6]);
print$a[1][2];
结果是6.
使用associativearray也类似:
$database{$name}{'home'}{'address'}='No.1234,75thStreet";
$database{$name}{'office'}{'phone'}='02-8127365";
Listofassociativearray也都可以使用.
2.9Example
Email中若有uuencode的资料,可以写perl将它extract出来.
#!/usr/local/bin/perl
open(EMAIL,"<$ARGV[0]")||die"Cannotopen$ARGV[0]:$!";
#若开不成perl会跳出且印Cannotopen...
while(){
if(/^begin\s \d\d\d\s /){
#遇到begin开头後印出
print$_;
while(){
if(/^end/){
#遇到end时结述
last;
}
print$_;
}
print$_;
last;
}
}
close(EMAIL);
可以写得更简化,不过那就属於您功力的无限空间了.........
-----ByPinhongChen--------------------------------------------------------
V1.0Feb11,1996
- ››适合做商品团购营销的网站
- ››适合所有浏览器hack的CSS技巧
- ››适合C# Actor的消息执行方式(1):Erlang中的模式...
- ››适合C# Actor的消息执行方式(2):C# Actor的尴尬...
- ››适合C# Actor的消息执行方式(3):中看不中用的解...
- ››适合C# Actor的消息执行方式(4):阶段性总结
- ››适合C# Actor的消息执行方式(5):一个简单的网络...
- ››适合C# Actor的消息执行方式(6):协变与逆变
- ››适合1-5个月经验的seo优化全过程分享
- ››Perl 6 发布
- ››简介CentOS配置ssh系统技术
- ››Perl 和 Amazon 云,第 1 部分:通过构建简单的照...
更多精彩
赞助商链接