自動目錄
迴圈和一般程式語言大同小異,主要有幾種
while
do...while
do...until
foreach
for
while
寫法
作用是當符合條件就處理,如果一開始就不符合條件,迴圈中連一次都不會執行。while的大括號不可省略。
$a=0; while($a<10){ print "."; #共印出10個點 $a ++; }
do...while
寫法
和while不一樣是一開始一定會執行一次,然後再判斷會不會繼續執行迴圈。注意最後面的分號。
$a=0; do{ print "."; $a ++; }while($a<10);
do...until
寫法
和do...while一樣是一開始一定會執行一次,但是在判斷時條件要寫不符合的,才會繼續執行迴圈。注意最後面的分號,所以上例要改寫成
$a=0; do{ print "."; $a ++; }until($a>=10);
for
寫法
for 項目 ( 範圍 ){ 處理 }
輸出數字 1-10
for($ii=1;$ii<=10;$ii++){ print $ii . "\n"; }
這樣寫太麻煩了,PERL中可以用範圍運算子來作
for $ii (1..10){ print $ii . "\n"; }
再懶點的把$ii也偷懶的省略掉,但省略掉後要怎麼代表$ii呢?
PERL就用一個特殊變數 $_來代替,這就是「預設變數」。在 09- 雜湊這個單元有先提過,未來只要看到 $_ 也不必大驚小怪了。改寫後的結果是
for (1..9){ print $_ . "\n"; }
輸出 A-Z 26個字母
PERL還有一些神奇的技巧,要用迴圈印出大寫英文字母怎麼做?你不必去翻ASCII然後把數字轉成字元。只要這樣就行了:
for ('A'..'Z'){ print $_ . "\n"; }
foreach
寫法
使用foreach列出陣列內容
@name = qw (John Mary Robinson 王大明 李小美); foreach $one (@name){ print $one. "\n"; }
結果
John
Mary
Robinson
王大明
李小美
上面的 $one 就是陣列中的項目,在foreach中依序被叫出,如前所述,我們把它省略掉:
@name = qw (John Mary Robinson 王大明 李小美); foreach (@name){ print $_. "\n"; }
使用foreach列出雜湊內容
在 09- 雜湊這個單元已有提過傾印出雜湊的內容,讀者可前往參考。
無限迴圈
無限迴圈會造成你程式的死當,使用上得小心。
while(1){ .. }
for(;;){ ... }
do{ ... }while(1)
迴圈的控制
迴圈的控制有三種
next 下一筆記錄,等同於其它語言的 continue
last 這是最後一筆,等同於其它語言的 break
redo 重新開始執行
next
next是跳下一筆項目,在next後面的程式不會被執行,例如印九九乘法,但是不印平方數(2*2, 3*3, 4*4...)
for($ii=2;$ii<10;$ii++){ for($jj=2;$jj<10;$jj++){ next if $ii==$jj; print "$ii*$jj=". $ii*$jj. "\t"; } print "\n"; }
第3行 判斷如果乘數被乘數相同就跳下一個項目
第4行 \t 是定位符號
結果
2*3=6 2*4=8 2*5=10 2*6=12 2*7=14 2*8=16 2*9=18
3*2=6 3*4=12 3*5=15 3*6=18 3*7=21 3*8=24 3*9=27
4*2=8 4*3=12 4*5=20 4*6=24 4*7=28 4*8=32 4*9=36
5*2=10 5*3=15 5*4=20 5*6=30 5*7=35 5*8=40 5*9=45
6*2=12 6*3=18 6*4=24 6*5=30 6*7=42 6*8=48 6*9=54
7*2=14 7*3=21 7*4=28 7*5=35 7*6=42 7*8=56 7*9=63
8*2=16 8*3=24 8*4=32 8*5=40 8*6=48 8*7=56 8*9=72
9*2=18 9*3=27 9*4=36 9*5=45 9*6=54 9*7=63 9*8=72
last
last 直接跳出迴圈,該迴圈後面的項目不會被處理,如果有多層迴圈只會跳出該層。
例如把上面的程式第3行的next改為last。代表只要遇到乘數被乘數相同,後面的項目都不執行:
last if $ii==$jj;
結果
3*2=6
4*2=8 4*3=12
5*2=10 5*3=15 5*4=20
6*2=12 6*3=18 6*4=24 6*5=30
7*2=14 7*3=21 7*4=28 7*5=35 7*6=42
8*2=16 8*3=24 8*4=32 8*5=40 8*6=48 8*7=56
9*2=18 9*3=27 9*4=36 9*5=45 9*6=54 9*7=63 9*8=72
如果遇到某些情況要跳出多層迴圈要怎麼處理,PERL提供了標籤的功能,可以在迴圈前加上標籤。假設上面的範例中,相乘大於50就停止二層迴圈:
for($ii=2;$ii<10;$ii++){ for($jj=2;$jj<10;$jj++){ last if $ii==$jj; last CYCLE1 if $ii*$jj>50; print "$ii*$jj=". $ii*$jj. "\t"; } print "\n"; }
第1行 這個迴圈標記名稱 CYCLE1
第4行 中如果相乘大於50,last到標籤 CYCLE1
結果
3*2=6
4*2=8 4*3=12
5*2=10 5*3=15 5*4=20
6*2=12 6*3=18 6*4=24 6*5=30
7*2=14 7*3=21 7*4=28 7*5=35 7*6=42
8*2=16 8*3=24 8*4=32 8*5=40 8*6=48
redo
這個項目重做一次迴圈,這個操作只會進行迴圈中{ }裡面的操作,不會再去評估是否符合條件(如果有設條件的話,例如while(條件))
我舉一個範例,假設Mary, Steve, John三個人要隨機抽數字,沒抽中就重抽,直到中為止,列出大家要抽中的需要的次數
@name= ('Mary', 'Steve', 'John'); $prizenum=33; $pick=0; foreach( @name){ $yournum=int rand() *100 ; $pick++; redo if $prizenum != $yournum; print "$_ 抽了 $pick 次得獎\n"; $pick= 0; }
第5行 rand()是取亂數的函式,數字會在 0< 亂數值 <1,再把他乘100後取整數,得到0~99之間的數字。
第6行 抽獎次+1
第7行 如果沒抽中,重抽,跳到第5行執行
結果
Mary 抽了 68 次得獎
Steve 抽了 13 次得獎
John 抽了 20 次得獎
這篇主要說明幾種迴圈,PERL還有一些隱藏式的迴圈,例如運算子 'x'、map、grep等等,這裡就先不介紹。
上一篇 08-陣列 #2 --操作
回到目錄 01-撰寫第一隻PERL程式
下一篇 10- 雜湊