[精讚] [會員登入]
890

[PERL] 09-迴圈

perl的迴圈

此文完整連結 http://n.sfs.tw/11683

複製連結 [PERL] 09-迴圈@新精讚
(文章歡迎轉載,務必尊重版權註明連結來源)
2017-08-25 01:07:44 最後編修
2017-08-23 13:21:12 By 張○○
 

迴圈和一般程式語言大同小異,主要有幾種

while

do...while

do...until

foreach

for

while

寫法

while( 符合條件 ){ 處理 }

作用是當符合條件就處理,如果一開始就不符合條件,迴圈中連一次都不會執行。while的大括號不可省略。

$a=0;
while($a<10){
  print "."; #共印出10個點
  $a ++;
}

do...while

寫法

do{ 處理 }while( 符合條件 );

和while不一樣是一開始一定會執行一次,然後再判斷會不會繼續執行迴圈。注意最後面的分號。

$a=0;
do{
  print ".";
  $a ++;
}while($a<10);

do...until

寫法

do{ 處理 } until( 不符合條件 );

和do...while一樣是一開始一定會執行一次,但是在判斷時條件要寫不符合的,才會繼續執行迴圈。注意最後面的分號,所以上例要改寫成

$a=0;
do{
  print ".";
  $a ++;
}until($a>=10);

for

寫法

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 項目 ( 陣列或清單 ){ 處理 }

使用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就停止二層迴圈:

CYCLE1: 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 --操作

下一篇 10- 雜湊

 

你可能感興趣的文章

[PERL] 前置if和後置if (if修飾子)的差別 perl的if可以拿來作為後置修飾子使用,此外還有一個unless像是if的相反,分析他們的差異

[PERL] 01-撰寫第一隻PERL程式 PERL的系列教學文,適合有其他程式經驗但沒學過PERL的人

自行撰寫syslog server建立資訊安全控管中心#1 -- 前言及syslog介紹 利用PERL將syslog收攏到資料庫的程式

[PERL] 19-模組的安裝和維護 模組的安裝和維護

[PERL] 13- 變數的視界 Perl 的副程式就是所謂的函數

[PERL] 常態分配亂數產生函數 一般而言我們使用程式內建的 rand 函數取得的亂數是平均分配的,但如果需要常態分配的亂數產生器該怎麼做?

[PERL] 04-基本比對 perl的正規表達示基本比對

自行撰寫syslog server建立資訊安全控管中心#2 -- 架構和作法 利用PERL將syslog收攏到資料庫的程式,架構和作法

[PERL] 22-日期和時間 Perl 取得日期時間的方法整理,使用 localtime等多種函數

[PERL] 07-陣列 #1 -- 基本 perl的陣列

我有話要說


限制:留言最高字數1000字,超過部分會被截掉。請注意:留言不可帶有網址,會被濾掉。 限制:未登入訪客,每則留言間隔需超過10分鐘,每日最多5則留言。

訪客留言

[無留言]

隨機好文

[jQuery] textarea 的取值和給值 HTML 的 TEXTAREA 標籤若要用 jquery 取值,不能使用 .text() 或 .html() ,使用 .

[CodeIgniter3] 解決無法上傳特定檔案(.sb2)的問題 上傳時出現The filetype you are attempting to upload is not allowed,要怎麼解決?

好用的3+2碼郵遞區號查詢系統推薦 網路上找到用地址輸入判斷3+2碼郵遞區號的辨識率不高,除了這個網站…

維修海棉拖把頭 這類型的海棉拖把很好用,可是這近發現海棉頭越來越不耐用,也許是錯覺,以往都能用個三四個月,現在二個月就差不多掉下來。 這

此一時彼一時 我是不是易怒的人,其實我也不知道,總之我常會失控,不知道自己在幹嘛。這近生活過得浮浮的,不是很踏實,總會想太多,我甚至會