这里没有软件测试的泛泛理论,只有博主的最佳实践。 博主的研究方向为静态分析和性能测试,致力于各种测试工具的引入、评估和开发。 本博的测试文章均为作者原创,转载请务必注明出处。

小骆驼书作业三:列表和数组

上一篇 / 下一篇  2008-07-03 10:52:48 / 个人分类:Perl

在开始本章的作业之前,有两个很深的体会:

×Perl非常聪明:聪明到有时候“你什么都不用说,只需要一个眼神,她便领会你的意思”,但有时候也会“聪明反被聪明误”

×Perl的聪明最终要归功于她的作者Larry。所以说,在一定程度上,学习Perl的大半过程,就是在学习Larry的思考模式。只要你能以Larry的方式思考,对Perl驾轻就熟是很容易的事情。

今天的作业很简单,没什么特别说明的,主要是练习@、reverse、sort的用法。不过在练习的过程中还是发现了一点小诀窍。

×print 中引号的作用

请看以下的代码:

#!/usr/bin/perl -w
@sorted = sort qw/zzz aaa iii bbb ggg/;
print @sorted;  #第三行
print "\n";
print "@sorted"; #第五行

在没有实际练习之前,我认为第三行和第五行的输出结果应该是一样的,因为Perl的座右铭“办法不止一种”以及“能省则省”。但实际调试后,我发现结果其实不一样,下面是实际的输出结果:

aaabbbgggiiizzz
aaa bbb ggg iii zzz

很显然,加了引号以后,输出自动用空格把各个字符串隔开;没有加引号,这些字符串全部串在一起,非常不容易看明白。很显然,这里的引号很好很强大。

×foreach结构中的控制变量

请看以下代码:

#!/usr/bin/perl -w
$rock = "I am a pure man";
print "The before-foreach rock are: $rock \n";
@rocks = qw/ bedrock slate lava /;
print "The before-foreach rocks are:  \n",@rocks;
foreach $rock (@rocks)
{
 $rock = "\t$rock";
 $rock.= "\n";
}
print "The after-foreach rocks are: \n", @rocks;
print "The after-foreach rock are: $rock \n";

输出结果为:

The before-foreach rock are: I am a pure man
The before-foreach rocks are: bedrock slate lava
The after-foreach rocks are:
  bedrock
  slate
  lava
The after-foreach rock are: I am a pure man

这里想说明两个问题:

1 foreach控制变量$rock并不是列表@rocks的复制,实际上,它就是列表本身,所以说当你在循环中修改了循环变量(如上例子所示),实际上也会修改到相应的列表元素本身。即,在foreach结构中,循环变量和列表之间的关系是“引用”,而不是“复制”的关系,这样就比较容易理解了。

2 当foreach循环结束后,控制变量$rock又被还原成循环以前的值,Perl会自动存储foreach循环的控制变量的值并在循环结束后还原它。很惊奇嘛,Perl就是这样的,因为Larry就是这么想得。

复习笔记

×数组的索引可以从前往后计数,从0开始,到MAX-1,使用时直接用$rocks[i]就可以;
  当然它还可以从后往前计数,从-1开始,$rocks[-1]就表示数组的最后一个元素。

×$#rocks就表示数组@rocks的最后一个索引值,这样的话,数组元素的个数就可以用$#rocks+1表示,数组的最后一个元素可以用 $rocks[$#rocks]访问,非常灵活方便。

×可以使用pop/push操作符对数组从“右边”增减元素,也可以使用shift/ushift从“左边”操作。

×默认变量$_:如果在foreach循环的开头省略了控制变量,Perl会使用默认变量$_。

×reverse和sort 分别可以对列表进行反向排序 和 ASCII排序

×假函数scalar可以强制指定标量上下文

×Unix和Linux上,输入Ctrl + D,Windows上使用Ctrl + Z,可以告诉系统输入结束了,这一点在使用列表输入<STDIN>时经常用到。

 


TAG: Perl

 

评分:0

我来说两句

Open Toolbar