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

小骆驼书作业二:标量数据

上一篇 / 下一篇  2008-06-30 17:45:50 / 个人分类:Perl

第二题:写一支程序,让它提示用户输入半径的长度,然后计算并输出圆的周长应该是多少。

#!/usr/bin/perl
$pi = 3.141592654;
print "Please input the radius:\n";
$radius = <STDIN>;
#print $radius;
$circus = 2 *$pi* $radius;
#print $circus;
print "The circumference of the circle is $circus. \n";

很简单的程序,不是吗?但我调试了两次才得到正确的答案,这是真的,以上代码中的黑体注释#就是我调试的过程,最后发现问题出现在黑体的pi上。好歹也算老的C程序员了,怎么能在这里栽跟头!

我算是从C过渡来的Perl用户,由于习惯了C的语法,虽然在大多数地方已经注意到了Perl中标量数据都要用$开头,但还是忘了一处地方,看了好几遍硬是没看出来,调试了两次才找到根源。

由此得出:经验是把双刃剑。

参考了标准答案,以上我的答案和标准答案的差别在于第4行,我直接用

$radius = <STDIN>;

而标准答案是

chomp($radius = <STDIN>);

chomp操作符的作用是“移除字符串结尾的换行符”。由于Perl中数据类型和传统的编程语言不一样,传统语言中的整型、浮点型、字符、字符串在Perl中都属于“标量数据”一个类型,所以当$radius = <STDIN>;执行时:

如果我输入12.5,那么作为数值参与运算的$radius就是12.5,但如果作为字符串时,$radius的值是12.5\n;

相比较,chomp($radius = <STDIN>);执行时输入12.5,则无论字符串还是数值都为 12.5

所以推荐在大多数用<STDIN>输入的情况下,都要用chomp来移除最后的换行符。

其实上面的这个结论不是从这个题目中得出的,而是从下面这道题。

第五题:写一支程序,提示用户键入一个字符串及一个数值(分两行输入),然后以数值为重复次数,连续输出字符串。在用户键入fred和3时,应该会输出3行fred。

#!/usr/bin/perl
print "Please input a string:\n";
$str = <STDIN>;
print "Please input a num:\n";
$b = <STDIN>;
$result = $str x $b;
print "the result is :\n $result\n";

我的这个答案很标准,没什么可说的。因为题目要求的输出三行fred,即要求输入的字符$str要求带一个换行符\n,所以这里不需要chomp操作符。但如果题目是要求输出在一行,如fredfredfred,则必须使用chomp。

另Perl中的注释用#表示,但#!可不是表示注释,它用于程序开始时,后面的路径表示的是执行下面代码的应用在哪里,也就是Perl解释器在哪里了。

复习笔记

×Perl中的数据类型很独特,一个标量搞定了其他语言中几乎所有基本类型。当然标量就是Perl中的基本类型了。

×而且Perl中的数值内部格式都相同,一律使用“双精度浮点数”参与运算,有效值的范围从1e-100到1e+100,好大哦,几乎不用担心会溢出的问题。

×Perl中的字符串也异常强大,它不仅可以包含任何字符,还可用它来对二进制数据进行创建、扫描与操作,如你可以对一个图形文件或者编译过的可执行文件读进Perl的字符串中,改变它的内容后,再写回去。好强大,这样做岂不是对软件破解帮了很大的忙。

×双引号字符串和单引号字符串唯一的不同是,单引号不支持转义字符,而双引号支持。

×字符串操作符 . 用户连接不同的字符串,而 x 用户字符串复制,使用非常方便,而且永远不用担心字符串溢出,除非你的物理内存不够用了。

×建议使用Perl的内置警告功能,只需要在第一行加上 -w即可,如

#!/usr/bin/perl -w

×Perl中数值比较和C一样,但字符串比较需要用字母,相当于单词简写

字符串相等比较 用 eq (equal),不等用 ne(not equal),小于用lt(less than),大于用gt(greater than),小于等于用le,大于等于当然用ge了。哈哈,搞懂了规律,是不是很好记?

×Perl中如果变量没有定义,它的初始值就是undef。如果undef当作数值参与运算,就会假设是0;如果当作字符串使用,就会假设是空字符串。但undef既不是数字也不是字符串,它完全是另外一种类型的标量值。

就是这些了,就到这里。

 

 


TAG: Perl

A life of a snail man 引用 删除 intothestorm   /   2008-11-12 11:14:03
很好,笔记非常详细,我就很偷懒了 ^^
 

评分:0

我来说两句

Open Toolbar