天天看點

unless,until, for, while, last, next,foreach redo

unless

在if 控制結構中,隻有條件為真時,才執行塊中的代碼。如果你想在條件為假時執行,可以使用unless:除非條件為真,否則執行塊中的代碼

unless($fred =~ /^[A-Z_]\w*$/i){

print “The value of \$fred doesn’t look like a Perl identifier name.\n”;

}

unless 和else 語句一起使用

unless 中也可以有else 語句。雖然文法上支援,但可能引起混淆:

unless ($mon =~ /^Feb/){

print “This month has at least thirty days.\n”;

}else{

print “Do you see what’s going on here?\n”;

until 控制結構

有時,希望将while 循環的條件部分取反。此時,可以使用until:

until($j > $i){

$j *=2;

表達式修飾符

為了得到更緊湊的形式,表達式後可以緊接控制修飾語。如,if 修飾語可以像if 塊那樣使用:

print “$n is a negative number.\n”if $n<0;

還有一些其它的修飾語:

&error(“Invalid input”) unless &valid($input);

$i *= 2 unitl $i > $j;

print “”, ($n += 2) while $n <10;

&greet($_) foreach @person;

last 操作

last 會立刻結束循環。(這同C 語言或其它語言中的“break”語句類似)。它從循環塊中“緊急退出”。當執行到last,循環即結束,如下例:

#輸出所有出現fred 的行,直到遇見_ _END_ _标記

while(<STDIN>){

if(/_ _ END_ _/){

#這個标記之後不會有其它輸入了

last;

}elsif(/fred/){

print;

##last 跳轉到這裡##

Perl 的5 種循環體分别是for, foreach, while, until,以及“裸”塊◆。花括号括起來的if 塊,子程式◆不算。在上面的例子中,last 對整個循環塊其作用。

next 操作

有時還不希望結束循環,但本次循環已經結束。這種情況下,next 是非常适用的。它跳到目前循環塊的最後面(塊内)next 之後,又會進入下一輪循環(這和C 或者類似語言的“continue”相似,但不一樣):

  1. #分析輸入檔案的單詞
  2. while(<>){
  3. foreach(split){ #将$_分拆成單詞,并依次賦給$_
  4. $total++;
  5. next if/\W/; #不是“words”的被跳過k
  6. Perl 語言入門(第四版)
  7. [email protected] 132 / 201 9/21/2006
  8. $valid++;
  9. $count{$_}++; #對每個單詞進行計數
  10. ##next 跳到這裡##
  11. print “total things = $total, valid words = $valid\n”;
  12. foreach $word (sort keys %count){
  13. print “$word was seen $count{$word} time.\n”;

redo 操作

循環控制的第三個操作是redo。它會調到目前循環塊的頂端,不進行條件表達式判斷以及接着本次循環.

  1. #輸入測試
  2. my @words = qw{ fred barney pebbles dinoWilma betty };
  3. my $errors = 0;
  4. foreach(@words){
  5. ##redo 跳到這裡##
  6. print “Type the word ‘$_’: ”;
  7. chomp(my $try =<STDIN>);
  8. if($try ne $_){
  9. print “sorry –That’s not right.\n\n”;
  10. $errors++;
  11. redo; #跳轉到循環頂端

next 和redo 的最大差別在于,next 會進入下一次循環,而redo 會繼續執行本次循環