2.1 数字
虽然标量在大多数情况下不是数字就是字符串,现在我们最好还是将它们分开来看待。我们首先讨论数字,再讨论字符串。
2.1.1 所有数字内部的格式一致
在下面几段中,你将看到整数(如255,2001 等)和浮点数(有小数点的实数,如3.14159,1.35x1025),但在内部,Perl 都把
它们当作双精度浮点数来处理◆。这就是说在Perl 内部没有整数值。程序中的整数被当做等价的浮点数来处理◆。你也许
注意不到这种转换(或者不关心),但你不应当寻找只属于整数的操作符(不能被浮点数使用的),因为它们不存在◆。
◆双精度浮点类型类似于C 中由double 定义的类型。它们的大小可能和具体的机器相关,许多当代的系统都使用IEEE-754 的格式,它有15
位精度,其范围至少在1e-100 到1e100 之间。
◆有时,Perl 也会使用内部的整数,其对程序员不可见。这样做导致的唯一不同是,程序将运行更快。谁又能抱怨它呢?
◆Perl 中有integer pragma.但如何使用它超出了本书的范围。正如你将看到的,某些操作可以从浮点数得到整数。但那不是我们此刻讨论的问题。
2.1.2 浮点数
数字符号(literal)是Perl 程序源代码中代替某个值的方法。数字符号不是计算或I/O 操作的结果,它是直接写进代码中的
数据。
你可能已经很熟悉Perl 的浮点数。有或没有小数点的数字都是允许的(包括+或-号),也可带一个十进制的指数(符号为E)。
1.25
255.000
255.0
7.25e45 #7.25x10 的45 次方(一个大整数)
-6.5e24 # -6.5x10 的24 次方(一个绝对值很大的负数)
-12e-24 #- -12x10 的-24 次方(一个绝对值很小的负数)
-1.2E-23 #指数符号可以大写(E)
2.1.3 整数
整数是简单明了的:
0
2001
-40
255
61298040283768
最后一个读起来有些困难。Perl 允许用下划线来分隔它,因此可以像下面这样书写:
61_298_040_283_768
它们是相同的值,但形式上有些不同。你可能认为逗号(,)更恰当,但逗号在Perl 中有其它用途(下一章中将介绍)。
2.1.4 非十进制整数
同许多其它语言一样,Perl 也允许使用非10 为底的数字。八进制以0 开头,十六进制以0x 开头,二进制0b 开头◆。在十
六进制中A 到F(或者a 到f)分别表示10 到15:
◆“前置0”指示符只对数字有效,对由字符串转换过来得数字无效,在本章后面你可以看到。可以利用oct()或hex()把某个看起来像八
进制或十六进制的数据串转换成数字。虽然没有“二进制”(bin)函数来转换二进制的值,如果某个字符串以0b 开头可由oct()做到。
0377 #八进制数字377,等同于十进制数字255
0xff #十六进制数字FF,等同于十进制数字255
0b11111111 #等同于十进制数字255
这些数字表面上看起来并不相同,但这三个数在Perl 中都代表同一个数。对于Perl 来讲,0 xFF 或255.00 是没有区别的,
因此选择一种你和你的程序维护者(我们是指那个要读懂你代码的可怜伙计。通常,这个可怜的家伙就是你,你很可能想
不起3 个月前,你为什么要那样做)认为最有意义的一种。
当一个非十进制的数字超过4 位时,读起来将很困难。由于这个理由,Perl 允许你使用下划线来区分:
0x1377_0B77
0x50_65_72_7C
2.1.5 数字操作符 Perl 除了提供通常的操作符加(+),减(-),乘(*),除(/)等等之外: 2+3 #2+3,5 5.1-2.4 #5.1-2.4,2.7 3*12 #3*12,36 14/2 #14/2,7 10.2/0.3 #10.2/0.3,34 10/3 #通常是浮点除,3.33333… … 还提供了模数运算符(%)。10%3 的值是10 除以3 的余数。两个操作数首先变成它们对应的整数值,如10.5%3.2 转换为 10%3◆后再计算。另外,Perl 中提供了和FORTRAN 类似的指数操作符,C 和Pascal 很希望有类似的能力。这个操作符由 两个*号表示,如2**3,表示2 的3 次方,等于8◆。我们将在需要的地方介绍其它的数字操作浮。 ◆注意,在模数运算中,如果有一个操作数为负数,那其结果和Perl 的具体实现相关。 ◆通常不能进行一个负数的非整数次方的运算。对数学有一定了解的读者知道,这将产生一个复数(数学概念中的复数:如1+2i,译注)。 如果想进行类似的预算,你需要Math::Complex 这个模块