perl c语言,perl简介(适合对c语言有点认识的读者)_perl教程

##########################################################################

#版权声明#

##

#本篇文章的版权为作者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,”#若开不成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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值