Perl 语言的流程控制




一 选择性流程控制

指令: if 假如

语法一:

if(判别运算式)
{

程序叙述区块;

}

上个语法在Perl中也可以写成:

程序叙述区块 if (判别运算式);

范例:

print"请输入您的分数?\n";
$scorre=<STDIN>; #<STDIN>代表标准输入,会让使用者输入一字符串
chop($score); #将$score最后一个换行字符\n删除掉
if($score>=60){

print"您的分数及格了!\n";

}

也可以写成: print "您的分数及格了!\n" if ($score>=60);

语法二: if(判别运算式一){

程序叙述区块一;

}else{

程序叙述区块二;

}

范例:

print"请输入您的分数?\n";
$scorre=<STDIN>;
chop($score);
if($score>=60)
{

print"您的分数及格了!\n";

}else{

print"您的分数不及格!\n";

}

语法三: if (判别运算式一)
{

程序叙述区块一;

}elsif(判别运算式二){

程序叙述区块二;

}else{

程序叙述区块三;

}

范例:

print"请输入您的分数?\n";
$scorre=<STDIN>;
chop($score);
if($score>=60)
{

print"您的分数大于60分!\n";

}elsif ($score<60){

print"您的分数小于60分!\n":

}else{

print"您的分数刚好是60分!\n";

}

指令: unless 假如非

语法一:

unless(判别运算式) {

程序叙述区块;

}

上个语法在Perl中也可以写成:程序叙述区块 unless (判别运算式);

范例:

print"请输入您的分数?\n";
$scorre=<STDIN>;    #<STDIN>代表标准输入,会让使用者输入一字符串
chop($score); #将$score最后一个换行字符\n删除掉
unless($score<60)
{

print"您的分数及格了!\n";

}

也可以写成: print"您的分数及格了!\n"unless($score<60);

语法二:

unless(判别运算式一)
{

程序叙述区块一;

}else{

程序叙述区块二;

}

范例:

print"请输入您的分数?\n";
$scorre=<STDIN>;
chop($score);
unless($score<60)
{

print"您的分数及格了!\n";

}else{

print"您的分数不及格!\n";

}


二 循环流程控制

指令:

while 当.. 语法: while(判别运算式) {

程序叙述区块;

}

上个语法在Perl中也可以写成: 程序叙述区块while(判别运算块);

范例一:

while($<=10)
{

$sum+=$i;
$i++;

}

print"$sum\n"; #此时$sum =55;

范例二:

$filename="/path/cgi.txt";
open(FILE,"$filename")||die "Cannot open $filename\n";
#可以把<FILE>视为打开文件某一行的数据
while($line=<FILE>)
{

print "$line";

}

close(FILE);

就会把cgi.txt这个文件的内容显示出来。

而这个范例可以把它改写成:

$filename="/path/cgi.txt";
open(FILE,"$filename")||die "Cannot open $ filename\n";
print "$line"while($line=<FILE>);
close (FILE);

    在这个范例中是把$filename文件内的数据一行一行的指派给$line这个纯量变量,再把$line显示出来.如果没有将<FILE>指派给一个纯量变量的话,则会有一内定的输入变量$_被<FILE>所指派.因为$_是一个内定的变量,所以如果使用print函数的时候没有加上要输出数据的话,就会把$_的数据print出来.所以这个范例也可以改写成: $filename="/path/cgi.txt";
open(FILE,"$filename")Ⅱdie"Cannot open $ filename\n";
while(<FILE>)
{

print;

}

close(FILE);

指令:

do while 当..

语法:

do
{

程序叙述区块;

}while(判别运算式);

在while和do while循环中最大的不同是在do while循环中,程序叙述区块至少会被执行一次。

范例:

do{

$sum+=$i;
$i++;

}while($i<=10);
print "$sum\n"; #此时$sum=55;

指令:

until 直到...才

语法: until(判别运算式)
{

程序叙述区块;

}

上个语法在Perl中也可以写成: 程序叙述区块 until (判别运算式);

范例:

until($i>10){

$sum+=$i;
$i++;

}

print "$sum\n"; #此时$Sum=55;

指令:

do while 直到...才

语法:

do{

程序叙述区块;

}until (判别运算式);

范例:

do{

$sum+=$i;
$i++;

}until($i>10);

print "$sum\n"; #此时$sum=55;

指令:

for 循环陈述

语法一:

for (初始化运算式;判别运算式;循环过程运算式)
{

程序叙述区块;

}

范例一:

$sum=0;
for($i=1;$i<=10;$i++)
{

$sum+=$i;

}

print "$sum\n"; #此时$sum=55;

范例二:

@array=(3,6,9);
$number=@array; #把数组@array的元素个数指派给$number
#此时$number=3;
for($i=0;$inumber;$i++)
{

$sum+=$array[$i]; #把数组@array元素的值全部加起来

}

print"$sum\n"; #此时$sum=18;

语法二:

for $ variable(@array)
{

程序叙述区块;

}

在Perl语言中的for循环陈述还可以使用这个语法,各循环陈述foreach的用法一样.如果把$variable变量省略的话,就会将数组@array的元素一个一个指定给$_这个变量,这是比较精简的写法.

范例:

@array=(3,6,9);
for $int(@array)
{

$sum+=$int;

}

print"$sum\n"; #此时$sum=18;

也可以写成:

@array=(3,6,9);
for (@array)
{

$sum+=$_;

}

print"$sum\n"; #此时$sum=18;

指令:

foreach 循环陈述

语法:

foreach $ variable(@array)
{

程序叙述区块;

}

如果把$variable变量省略的话,就会将数组@array的元素一一指定给$_这个内定的输出变量.

范例一:

@array=(3,6,9);
foreach $int(@array)
{

$sum+=$int;

}

print "$sum\n"; #此时$sum=18;

也可以定成:

@array=(3,6,9);
foreach(@array)
{

$sum+=$_;

}

print "$sum\n"; #此时$sum=18;

范例二:

%FORM=("name","NCTU","value","TEM");
foreach $pair(sort keys%FORM)
{

print "$pair is $FORM{pair}\n";

}

这个范例在CGI语言写作中常常会用到.先用keys喧个函数来求出关联数组中全部的key,再用sort这个函数把全部的key由小到大排序,最后再把关联数组中的key和所对应的值(value)一一显示出来.而以上这个程序也可写成:

%FORM=("name","NCTU","value","TEM");
@array=(sort keys%FORM);
foreach $pair(@array)
{

print "$pair is $FORM{pair}\n";

}

指令:

last 退出循环陈述

语法:

last

范例:

for($i=1;$i<=10;$i++)
{

last if ($i==5); #如果$i等于5的话就退出for循环
print"$i\n";

}

会把1到4之间的数值显示出来.

指令:next 到循环的下一个陈述

语法:next

范例:

for($i<=10;$i++)
{

#如果是2的倍数的话,就到循环的下一个陈述
next if($i%2)==0)

print"$i是一个奇数!\n";

}

会把1以10之间的奇数显示出来。