加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

Perl 簡介(適合對 C 語言有點認識的讀者)

发布时间:2020-12-16 00:12:56 所属栏目:大数据 来源:网络整理
导读:########################################################################## #???????????????????????????????版權聲明?????????????????????????????????#? #????????????????????????????????????????????????????????????????????????#? #???????本篇
##########################################################################
#???????????????????????????????版權聲明?????????????????????????????????#?
#????????????????????????????????????????????????????????????????????????#?
#???????本篇文章的版權為作者PinHong?Chen先生所有.?允許網路上的非營利?????#?
#???????轉載.?作者的電子郵件地址:honger.bbs@aidebbs.edu.tw???????????????#?
#???????本文可在下列URL取得:?????????????????????????????????????????????#?
#???????http://www.math.ncu.edu.tw/~chenym/perl/intro.html???????????????#?

From?news.ncu.edu.tw!news.cc.nctu.edu.tw!news.csie.nctu.edu.tw!aide_board?Wed?Feb?14?23:57:10?1996?
Path:?news.ncu.edu.tw!news.cc.nctu.edu.tw!news.csie.nctu.edu.tw!aide_board?
From:?honger.bbs@aidebbs.edu.tw?(Her?Done?Mine?Chao!)?
Newsgroups:?tw.bbs.comp.www?
Subject:?Basic?Introduction?to?Perl?
Date:?13?Feb?1996?06:54:46?GMT?
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?
????????????PPPP???EEEEE??RRRR???L?
????????????P???P??E??????R???R??L?
????????????PPPP???EEEE???RRRR???L?
????????????P??????E??????R??R???L?
????????????P??????EEEEE??R???R??LLLLLL?
1.?Introduction?
????這不是?perl?的完整介紹,只是想將?perl?向?C?programmer?作個介紹,也許能?
有所幫助!?
????perl?是由?Larry?Wall?先生所寫.?目前的版本?5.002,?加入多項的功能.?請?
看?perl.1,?那有詳細的條列.?
????一般而言,?由?awk,?sed,?shell?programming?寫的東西可以輕易用?perl?來?
處理,而且速度更快.?在?C?program?中,特別是有關抽取文字檔中的資訊,加以轉化?
的問題.?當然了,?perl?執行時會有一道轉成內部表示式的關,?真正?optimized?
過的?C?code?仍會比?perl?code?快.?一般而言,?perl?code?會比?C?code?短很多.?
????perl?在?regular?expression,?list(array)?和?associative?array?有很方?
便的語法和不錯的執行效率.?連?yacc?(Berkeley?yacc)?也可有產生?perl?code?的?
選項,?這對於?prototyping?十分方便.?
2.?Perl?Basics?
2.1?Basic?data?structure?and?Control?construct?
????perl?的?comment?是從?#?之後開始.而?perl?並不區分?string?
,?integer?和?float?point?number?的?data?type,?統統以純量代表.例如:?
#?This?is?a?comment?line?till?the?end?of?this?line?
$x=1.5;?
$y="I?hate?shell?programming";?
$z=1.3e-27;?
這個?$?是表示現在操作的是個純量(相對於?list?或?associative?array).?
在??C?裡的?operator,?如?+,-,*,/,%,^,++,--,+=,-=,*=,/=,%=,==,!=,?&&,??
||,?|,?&?全都有,?意思也不變.?不過若用於字串,?.?(dot)是表示連接的意思.?
因此?.=?也有類似?C?中?+=?的意思.?
$x='I?hate?';?
$x.="awk?programming.";?
print?$x;?
結果為?I?hate?awk?programming.?字串可用單或雙括號圍住.?超出一行也沒關.?
也可以寫的像?shell?programming?中:?
$x=?<<?END;?
This?part?can?be?put?what?
you?like?here?
1234567890?
till?the?sign?as?the?beginning.?
END?
相當於?
$x="This?part?can?be?put?what?
till?the?sign?as?the?beginning.";?
字串的比較有?eq,?ne,?gt,?lt,?....就像那?Fortran?的?operator.?聰明的?
你猜猜就知道啦.?
????至於?control?方面,?如?if,?while,?do?..?while,?都和?C?類似.?如:?
$sum=0;?
for($i=0;$i<10;?$i++){?
???$sum+=$i;?
}?
大括號是不可省略的!?這和?C?不同.?也可:?
$i=0;?
while($i<10){?
???$sum+=$i++;?
如果你要從?loop?中跳出來,?last?相當於?C?中?break,?next?相當於?continue.?
???if($i?%?2==0){?
??????$sum+=$i++;?
??????next;?
???}elsif($sum>50){?
??????last;?
???}?
???if?敘述要注意大括號是不可省,?還有?else?if?必須寫成?elsif.?
2.2?List?
????List?和?1?dimension?array?在?perl?中沒區別.??用法如:?
@a=(1,2,3);?
$a[0]-=$a[1];?
print?"a[0]=$a[0]";?
結果就是?a[0]=-1.?@是表示現在在操作?list.?雙括號的字串中,若有變數,?perl?
會直接解譯.?如上例中的?$a[0].?List?可以直接連接:?
@b=(4,5);?
@c=(@a,@b,6,7);?
print?"@c";?
結果是?1?2?3?4?5?6?7.?perl?有特殊的變數,?$#a?來表示?@a?的最後?index,?
所以上例中,?$c[$#c]?就是?7,?也可寫成?$c[-1].?那麼?$c[-2]?就是?6?了.?
????List?還有些?operator,?push,?pop,?shift,?unshift,?splice,?其中?
push?推一些元素入?list:?
push?@a,(3,4);?
結果?@a?成為?(1,3,4).?
pop?拉最後一個元素?:?
$b=pop?@a;?
shift,?unshift?和?pop,?push?類似不過操作在?list?前端.?
$b=shift?@a;?
unshift?@a,0;?
結果?@a?成為?(0,3),?$b?變成?1.?
????Loop?也可寫成:?
@weekday=(?'Mon','Tue','Wed','Thu','Fri','Sat');?
foreach??$x(@weekday){?
???#?schedule?something?
結果?$x?會依序變成??'Mon','Sat'?等.?
2.3?Associative?Array?
????這是使用?string?來做?index?的?array,?一般叫作?hash.?
$phone_no{'peter'}='02-9110238';?
$phone_no{'john'}="06-1234567";?
$name='peter';?
print?"$name?Phone?No.=",$phone_no{$name},"n";?
結果就會印一行:?
peter?Phone?No.=02-9110238?
???上面兩行也可寫成:?
%phone_no=(?'peter'?=>?'02-9110238',?'john'?=>?'06-1234567');?
=>?和?,?一樣所以:?
%phone_no=(?'peter'?,?'02-9110238',?'john'?,?'06-1234567');?
也可,?就是相當於一個?key?和?value,?所組成的list.?
2.4?Subroutine?
????副程式可以任意擺放,?perl?全看得到.?
sub?foo{?
???my?$x=$_[0];?
???my?$y=$_[1];?
???return?$x/$y;?
$x=1;?
$y=8;?
print?foo(4,0)">結果是?2.?
???上例中,?my?這個?keyword?表示,?$x,?$y?是在?foo?圍內有效?(local?variable?
in?subroutine?lexical?scope).而?$_[0],?$_[1]?用於傳參數.?perl?的?subroutine?
呼叫參數都是放在固定?@_?的?list?中.?
2.5?Special?Variables?
????perl?常使用的?default?variable?是?$_.?
foreach?(@weekday){?
???#?do?with?$_?
結果?$_?會依序變成??'Mon',0)">???@ARGV?是?perl?執行時的?command?line?argument,$ARGV[0]?相當於?C?中的?
argv[1].?$ARGV[1]?相當於?C?中的?argv[2].?C?中的?argv[0]?放在?$0.?
???%ENV?是?perl?執行時的?environment?variable,?$ENV{'HOME'}?就是?user?
的?home?path,?$ENV{'PWD'}?就是?current?path.?
???其它特殊變數請參考?perlvar.1.?
2.6?File?Handle?
????perl?中主要開檔的方法:?
open(FH,"test.dat");?????????????#?寫入?


???$oneLine=;?????????????????#?讀取?FH?
???print?FH?"1234";???????????????#?寫入?FH?
???close(FH);?????????????????????#?關檔?
例子:?

???printf?"%4d:%s",++$n,$_;?
close(FH);?
結果會把?test.dat?加?4?位行號印出.(?只寫???時相當於省略?$_=?).?
2.7?Regular?Expression?
????perl?對於?regular?expression?有重新改寫.?好用且功能強,?是?sed?和?awk?的?
superset.??要求執行?regular?expression?比對的?operator?為?~=?(?match),0)">!=?(?not?match).?regular?expression?用?/.../?括住.?
$line="???end;?";?
if($line?=~?/end/){?
???print?"match!";?
}else{?
???print?"NO!";?
結果會印出?match!,?如果改成?
if($line?=~?/^end/){?
結果會印出?NO!?
????^?????????????表string?的開端,0)">????$?????????????表string?的結束,0)">????[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?表非?space?character?
????若要取代,則:?
$d="Sep.?15th,?Sep.?17th";?
$a?=~?s/Sep/9/;?
結果是?9.?15th,?Sep.?17th,?加?g?(global)?option?如下:?
$a?=~?s/Sep/9/g;?
2.8?Reference?
????Perl?5.0?之後允許?list?of?list?也就可能有?2-Dimension?Array.?
例如:?
$a[0][0]=1;?
$phone{$name}[0]='1234';?
$phone{$name}[1]='2674';?
實際上?是用所謂的?reference,就像是?C?的?address.?一個純量可純存一個?
reference.?
$aref=@a;??????????#?取?@a?的?reference?
print?$aref->[0];???#?相當於?print?$a[0];?
push?@{$aref},4;????#?相當於?push?@a,4;?
2-dimension?array?可以如:?
@a=([1,3],[4,5,6]);?
print?$a[1][2];?
結果是?6.?
????使用?associative?array?也類似:?
$database{$name}{'home'}{'address'}='No.?1234,?75th?Street";?
$database{$name}{'office'}{'phone'}='02-8127365";?
???List?of?associative?array?也都可以使用.?
2.9?Example?
????Email?中若有?uuencode?的資料,可以寫?perl?將它?extract?出來.?
#!/usr/local/bin/perl?
open(EMAIL,"<$ARGV[0]")||die?"Cannot?open?$ARGV[0]:$!";?
#?若開不成?perl?會跳出且印?Cannot?open?...?
while(){?
???if(/^begins+ddds+/){?
??????#?遇到?begin?開頭後印出?
??????print?$_;?
??????while(){?
?????????if(/^end/){?
????????????#?遇到?end?時結述?
????????????last;?
?????????}?
?????????print?$_;?
??????}?
close(EMAIL);?
可以寫得更簡化,不過那就屬於您功力的無限空間了.........?

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读