Perl筆記 09 其他控制結構

2021-06-18 18:04:15 字數 4803 閱讀 2560

unless控制結構與if控制結構恰恰相反,if是判斷表示式為真才執行下面的語句塊,unless則判斷表示式為假就執行語句塊。

如果unless控制結構中加入else子句的時候那就相當於將if...else的**執行部分反過來寫是一致的:

unless

($mon

=~/^feb/

)else

與if($mon

=~/^feb/

)else

相同有時也許會想要顛倒while迴圈的條件。那麼可以使用until

until($j>$i)

這個迴圈回一直執行,直到條件為真。它只不過是個改裝過的while迴圈罷了,兩者之前唯一的差別在於until會在條件為假的時候重複執行。

表示式後面可以接著乙個用來控制它的修飾詞,例如用if修飾詞來模擬乙個if快:

print

"$n is a negative number.\n

" if

$n<0;

這一句**相當於下列的語句塊:if(

$n<0)

除了if修飾詞外,還有以下的修飾詞:

&error

("invalid input"

)unless

&valid

($input);

$i*=

2until

$i>$j;

print

" ",($n

+=2)while

$n<10;

&greet($_

)foreach

@person

;

所謂的裸快控制結構是沒有關鍵字或條件的**塊。不如現在有乙個while迴圈,如下所示:

while (condition)

然後拿走關鍵字while和條件,就會得到乙個裸塊:

裸塊像乙個while或foreach迴圈,可它從不迴圈,只執行一次。也就是乙個偽迴圈!

裸塊還有乙個好處,就是可以在裸塊裡使用臨時變數,而不會影響到全域性變數。

許多情況下,你需要逐項檢查一系列的條件表示式,看看其中哪個為真。這可以通過if控制結構的elsif子句來寫成如下**:if(

!defined

$dino

)elsif

($dino

=~/^-?\d+\.?$/

)elsif

($dino

=~/^-?\d*\.\d+$/

)elsif

($dino

eq''

)else

很簡單與c/c++一致

很簡單與c/c++一致

last操作符

操作符last能立即終止迴圈。就像在c語言中的break操作符一樣。當看到last,迴圈就會結束,例如:

# 輸出所有包含 fred的行,直到碰到 __end__ 標記為止

while()

elsif

(/fred/)}

## last comes here #

只要輸入行中有__end__記號,這個迴圈就會結束。

在perl中有5中迴圈塊。也就是for、foreach、while、until以及裸塊而if塊或者子程式帶的花括號不是迴圈的快。last操作符對整個迴圈塊起作用。

last操作符只會對執行中最內層的迴圈快發揮作用。

next操作符

next是跳過本次迴圈,像c中的continue一致。

redo操作符

redo操作符可以將控制返回到本次迴圈的頂端,不經過任何條件測試,也不會進入下一次迴圈迭代。而那些用過c語言的人們卻對這個操作符感到陌生。因為c語言裡沒有這個概念。例子如下:

# 打字測試

my@words=qw

;my$errors=0

;foreach

(@words)}

print

"you've completed the test, with $errors errors.\n";

和另外兩個操作符一樣,redo在這5中迴圈快裡都可以使用,並且在迴圈快巢狀的情況下只對最內層的迴圈起作用。

next和redo兩者之前最大的區別在於next會正常繼續下一次迭代,而redo則會重新執行這次的迭代。下面的例子可以然你體驗這三種操作符工作方式的區別:

foreach(1

..10

)print

"that's all, folks!\n";

perl裡的三目操作符和c語言中的一致。

條件表示式?真表示式:假表示式

&& / and 邏輯與

|| / or 邏輯或

! / not 邏輯非if(

$dessert

&&$dessert

)elsif

($dessert

||$dessert

)else

在perl 5.10中引入了「定義或」操作符//,在發現左邊已定義的值時進行短路,無論作弊的只是真是假。這些定義或(defined-or)操作符會跟那些邏輯或操作符一樣,只是它們測試的是是否已經定義,而不是布林值。

use5.010;my

$last_name

=$last_name

//'(no last name)';

上面的含義為:如果last_name雜湊中沒有$someon的鍵時就是用//後面的值作為$last_name的值。

使用部分求值操作符的控制結構

之前看到的四個操作符 &&、 ||、 // 和?: 都有乙個共性:根據左邊的求值決定是否計算右側的表示式。有些情況會執行的表示式,在另外的情況下並不執行。因此被統稱為部分求值操作符,部分求值操作符是天然的控制結構,因為不會執行所有的表示式。

如果寫過linux 下的shell指令碼的話應該能夠很快的了解這個部分求值操作符的說法,例如在linux 的shell中你可能寫過如下的**:

[-e/

etc/

passwd]&&

cat/

etc/

passwd

實際上在perl中也可以利用前面介紹的操作符來進行部分求值操作:

(

$m<$n)

&&($m=

$n);# 只有當$m的值小於$n的值時才會執行後面的操作

(

$m>10)

||print

"why is it not greater?\n";

#當$m的值小於10時才會列印輸出後面的內容。

三目操作符同樣可以成為控制結構。下面的例子,我們想將$x賦值給兩個變數中較小的那個:

(

$m<$n)

?($m=

$x):(

$n=$x)

;

「邏輯或」、「邏輯與」操作符的另外一種寫法。可以講他們寫成單詞or和and。這種單詞的形式和標點符號的形式的效果是相同的,但是前者在運算優先順序要低得多。既然單詞操作符不會緊緊的粘住附近的表示式,它們需要的括號可能會少一些:

$m<$n and $m = $n; #寫成相應的if語句版本會更好

另外乙個常用的寫法是:

open chapter, $filename

or die "can't open '$filename': $!";

通過使用低優先順序的短路or操作符,我們表達了open this file or die的意思。如果檔案開啟成功,就會返回真,此時or就不必執行了;但如果檔案開啟失敗,or就還得去執行右側的部分,也就是丟出資訊並終止程式。

********************本章習題********************=

1、編寫程式,讓使用者不斷猜測範圍從1到100的秘密數字,直到猜中為止。程式應該以公式int(1+rand 100)來隨進產生秘密數字。當使用者猜錯時,程式應該響應too hight或too low。如果使用者鍵入quie或exit等字樣,或者鍵入乙個空白行,程式終止。當然使用者猜到了,程式也終止。

答:#!/usr/bin/perl -w

use strict

;my$num

=int

(1+rand

100);

while(1

)elsif

($input

>

$num

)elsif

($input

<

$num

)elsif

($input

==$num)}

注意:這裡的判斷退出的語句一定要放到最前面,否則就會出錯。該程式中使用了int和rand函式,rand 100 會生成0以上100以下的隨機數,但要注意,並非是隨機整數,因此有可能為99.999,因此我這裡用 1+rand 100來操作,最後利用int函式取出整數部分。

2、修改遷前乙個程式,列印額外的除錯資訊,例如程式選擇的秘密陣列。確保修改的部分可以用開關控制,並且除錯開關即使關上也不會產生警告。如果使用perl 5.10版本可以用//操作符,否則請使用三目操作符。

答:這個程式是在之前的解答基礎上做了少量的修改。我們需要在開發過程中列印秘密數字,所以在$debug變數為真的時候呼叫print。而$debug的值要麼來自於環境變數,要麼是預設值1.通過使用//操作符,我們在$env未定義的時候設定它為1:

my$debug

=$env

?$env:1

;print

"this number is :$num\n"

if$debug;

perl 控制結構

perl結構控制語句 if條件語句 if condition elsif else unless條件語句 條件為假時執行.unless condition elsif else while迴圈語句 while condition while 1 死迴圈 until迴圈語句 條件為假時才執行 unti...

web前端學習筆記09 流程控制 分支結構

概念 對計算機 執行過程的控制 分類 順序結構 分支 選擇結構 迴圈結構 順序結構是指計算算計自上而下執行 的流程,是大多數語言的預設結構,沒有特殊的語法和操作。概念 根據不用條件執行不同的 分支 分類 單項分支結構 雙項分支結構 多項分支結構 巢狀分支結構 2.1 單項分支結構if 判斷條件 判斷...

《機電傳動控制》學習筆記09

機電傳動控制 學習筆記09 胡恆謙 機卓1301 1.電力電子器件 電力電子器件根據其導通和關斷可控性的不同可以分為以下三類。1 不可控型器件,即導通與關斷都不能控制的器件。僅整流二極體是不可控器件。2 半控型器件,即只能控制其導通,不能控制其關斷的器件。普通閘流體scr及其派生器件屬於半控型器件。...