10天学会perl第三天——条件与循环
Posted 生物坊
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了10天学会perl第三天——条件与循环相关的知识,希望对你有一定的参考价值。
每一种程序语言都是用来实现某种功能的,现实编程中,循环与条件结构是使得普通代码组合为一套复杂程序的基本结构,也是实现绝大部分任务需要用到的一类结构。某种程度上讲,学会了一种语言的条件与循环结构,基本的编程就学会了,余下的就是遇到什么事情就去查具体用法,在实践中不断掌握更多的语法使用。
perl条件结构
条件:
条件(让计算机可以分不同情况做不同事情的代码语法)
主体结构是这样的:
if ... elsif ... else ...
给个例子:
1my $anminal_name = "dog";
2my $anminal_name_length = length $ anminal_name;
3
4if($anminal_name_length >= 15) {
5 print "the name of", $ anminal_name, "' is a very long word";
6} elsif(10 <= $ anminal_name_length && $ anminal_name_length < 15) {
7 print " the name of ", $ anminal_name, "' is a medium-length word";
8} else {
9 print " the name of ", $ anminal_name_length, "' is a short word";
10}
上述代码其实就是告诉计算机这样做:
申明(创建)一个scalar类型变量anminal_name,里边存着dog这个词。
申明一个一个scalar类型变量anminal_name_length,里边存着变量anminal_name的长度(length是告诉计算机计算anminal_name变量的长度)
如果anminal_name_length变量的长度大于等于15个字母,就输出动物dog的名字太长了,否则如果anminal_name_length变量的长度大于等于10个字母但是又小于15个字母,就输出动物dog的名字中等长度,如果上述两种情况都不是,那就输出动物dog的名字很短。
三目运算符:
有时候我们可能只需要很简单的条件描述(比如就是一句话可以说清楚的条件),这时候perl提供了简洁的申明条件结构的语法——三目运算
三目运算符?:
使得简单的if
语句可以嵌入到其他语句内。一种常规的用法就是用来处理单复数形式:
1my $gain = 48;
2print "You gained ", $gain, " ", ($gain == 1 ? "experience point" : "experience points"), "!";
题外话:单复数形式最好都写出完整的拼写,不要自作聪明地写成下面这种样子,要不然别人永远也无法在代码中查找、替换到“tooth”或者“teeth”了:
1my $lost = 1;
2print "You lost ", $lost, " t", ($lost == 1 ? "oo" : "ee"), "th!";
三目运算符可以嵌套(就是三目运算符里套用又一个三目运算符):
1my $eggs = 5;
2print "You have ", $eggs == 0 ? "no eggs" :
3 $eggs == 1 ? "an egg" :
4 "some eggs";
if
语句在scalar上下文中进行求值。举例说明,if(@array)
当且仅当@array
包含大于等于1个元素的时候返回true,而元素的内容则无关紧要(也许包括undef
或者其他我们真正关心的代表false的值)。
循环
“每个问题都有不止一种解决方法”
Perl支持传统的while
循环,如下:
1my $i = 0;
2while($i < scalar @array) {
3 print $i, ": ", $array[$i];
4 $i++;
5}
上述代码是perl循环方式之一——while循环的标准格式(写法),其本质是告诉计算机做这样的事情(各位可以将下面的语言解释对应着上面的代码来理解while循环各部分的含义):
申明一个叫i的scalar类型的变量,并让他等于0,开始循环结构(while是开始的标志),当(while)变量$i小于数组array的大小时,打印输出变量i的值,接着打印输出冒号,接着打印输出数组array的第i个元素。令$i的值加一。好了,循环结构的第一次循环结束,进入下一次循环,这时$i的值是1,若满足$i小于数组array的大小,则开始循环,继续做上面的事情,如果不满足,整个循环结构就结束了, 下面要执行的代码就是循环结构}代码后的程序语句了。
Perl也提供了until
关键字(循环结构的另一种写法,理解until可以对比英文复合句中until句法的含义):
1my $i = 0;
2until($i >= scalar @array) {
3 print $i, ": ", $array[$i];
4 $i++;
5}
perl还提供了一种循环的结构,do循环,
这些do
循环几乎和上面的循环等价(如果@array
为空会抛出一个警告):
1my $i = 0;
2do {
3 print $i, ": ", $array[$i];
4 $i++;
5} while ($i < scalar @array);
或者这样:
1my $i = 0;
2do {
3 print $i, ": ", $array[$i];
4 $i++;
5} until ($i >= scalar @array)
复杂的循环条件是这样设置的,下述for循环小括号内以分号为间隔,依次表示了申明一个用于存储循环条件当前状态的变量并赋予初始的值;循环的终止条件;循环条件默认的变化方式(例如$i++表示每循环一次$i的值就加1)。注意我们怎么将my
放到for
语句内部,这样声明的$i
的作用于就仅限于循环内部:
1for(my $i = 0; $i < scalar @array; $i++) {
2 print $i, ": ", $array[$i];
3}
4# $i在这里就不存在了,代码显得更加整洁。
这种for
循环被视为过时的东西,应该尽量避免使用,使用原生的array迭代语法看起来更漂亮。for
和foreach
关键字是等价的,选可读性比较好的那个来用就可以了:
1foreach my $string ( @array ) {
2 print $string;
3}
如果你需要使用下标,range运算符..
会创建一个匿名(没有指定名字)的整形数列表(就是类似从1数到10之类的意思,比如0 .. $#array表示从0开始直到数组array最后一个元素的下标结束):
1foreach my $i ( 0 .. $#array ) {
2 print $i, ": ", $array[$i];
3}
上述代码的意思是:对每一个从0开始直到数组array最后一个元素的下标结束的所有array元素做这样的操作,即输出$i(元素下标),接着输出冒号,接着输出数组array的下标为$i的元素。
你无法迭代一个hash,而你可以迭代它所有的键。使用内置函数keys
来取得包含这个hash所有键的array,然后使用foreach
来遍历它:
1foreach my $key (keys %scientists) {
2 print $key, ": ", $scientists{$key};
3}
因为hash没有既定的次序,键可能以任何次序返回,使用内置函数sort
事先对包含键的array进行字母序排序:
1foreach my $key (sort keys %scientists) {
2 print $key, ": ", $scientists{$key};
3}
如果你没有显示指定迭代器(如上面代码中的$key,作用是每一次keys %scientists代码产生的值都依次存到变量$key中,在循环题内部我们可以通过$key获得当前的迭代值),Perl将使用默认迭代器$_(在没有指定迭代器时,perl默认申明一个变量$_当迭代器,等同于我们上面申明的$key)
。$_
是第一个也是最友好的一个内置变量:
1foreach ( @array ) {
2 print $_;
3}
如果使用默认迭代器,并且你希望在循环里只放一句语句,你可以使用下面这种超级简洁的语法:
1print $_ foreach @array;
循环控制
Next
(进入下一次循环)
和last
(这是最后一次循环)
可以用来控制循环过程,在其他大部分编程语言中分别相当于continue
(到这就结束了,不在运行循环结构里这句代码后边所有的代码,直接进入下一次循环中)
和break
(运行到这句代码时,结束循环结构,不管循环的终止条件有没有结束,循环结构到这就结束了,进入本循环结构之后的代码段)
。
一般约定,行标写成全部大写。在循环里加上行标以后,next
和last
可以选择指定跳转到某个行标。下面的示例程序能够找出100以内的素数:
1CANDIDATE: for my $candidate ( 2 .. 100 ) {
2 for my $divisor ( 2 .. sqrt $candidate ) {
3 next CANDIDATE if $candidate % $divisor == 0;
4 }
5 print $candidate." is prime
";
6}
循环控制通常在我们想要在循环内部增加一个特殊条件下的处理时用到,调试程序(找程序问题)的时候也用来检测循环语句某部分代码是否出问题之类的。
perl提供了丰富的条件与循环结构,每种写法都有各自的特点,在实际使用中,往往各种写法都用,具体选择哪种就看具体任务中哪种写法更简洁便利或者更容易实现。
条件与循环是perl语言学习的重点,需要多加练习来了解其具体的运作原理。
生物坊
专注做生信的引路人
不做具体技术细节的推广
以上是关于10天学会perl第三天——条件与循环的主要内容,如果未能解决你的问题,请参考以下文章