Preface
Content
运行程序时,Perl内部的编译器会先载入整个源程序,将之转换成内部使用的bytecode,这是一种Prel在内部用来表示程序语法树的数据结构,然后交给Perl的bytecode引擎运行.所以,如果在第200行有个语法错误,那么在开始运行第二行代码之前,Perl就会报告这个错误.
英语跟许多其他语言一样区别单数(singular)和复数(plural).作为一个由人类语言学家设计的计算机语言,Perl也有类似的区别.一般来说,Perl用标量(scalar)来称呼单个失误.标量是Perl里面最简单的一种数据类型.对大部分标量来说,它要么是数字(比如255或是3.25e20),要么是由字符组成的序列(比如hello或者林肯总统的Gettysburg演讲词).虽然你可能认为数字和字符串是两码事,但对Perl来讲,这两者大多情况下都是可以在内部转换的.
所有的内部格式都相同
接下来,我们会看到如何设定整数(不带小数点的数字,比如255和2001)以及浮点数(带有小数点的数字,比如3.14159或者1.35*10^25等).但在Perl内部,则总是按"双精度浮点数"的要求来保存数字并进行运算的.也就是说Perl内部并不存在整数值–程序中用到的整型常量会被转换成等效的浮点数值.
浮点数直接量
整数直接量:Perl允许你在整数直接量中插入下划线,将若干位数分开,写成这样看起来就很清楚了:
61_298_040_283_768
和许多其他程序语言一样,Perl也允许使用十进制(decimal)以外的其他进制来表示数字.八进制(octal)直接量以0开头,十六进制(hexadecimal)直接量以0x开头,而二进制(binary)直接量则以0b开头.十六进制的A到F(或是小写的a到f也行),代表十进制数的10到15的数字.
Perl还支持取模(modulu)操作符(%).表达式10%3的结果是1,也就是10除以3的榆树.取模操作符先取整然后再求余,所以10.5%3.2和10%3的计算结果是相同的.另外,Perl也提供类似FORTRAN语言的乘幂(exponentiation)操作符,满足了许多Pascal和C用户的心愿.乘幂操作符以双星号表示,比如2**3代表2的3次方,计算结果为8.
Perl完全支持Unicode,所以在字符串中可以使用任意一个合法的Unicode字符串.不过由于Perl的历史原因,它不会自动将程序源代码当做Unicode源码的文本文件读入,所以如果你想要在源代码中使用Unicode书写直接量的话,得手工加上utf8编译指令:
use utf8;
反斜线后面跟上不同的字符,可以表示各种不同的意义(一般我们把这种借助反斜线组合表示特殊字符的方法称作反斜线转义).在双引号内的字符串直接量内允许使用的比较完整的转义字符清单如表2-1所示.
组合 | 意义 |
---|---|
\n | 换行 |
\r | 回车 |
\t | 水平制表符 |
\f | 换页符 |
\b | 退格 |
\a | 系统响铃 |
\e | Esc(ASCII编码的转义字符) |
\007 | 八进制表示的ASCII值(此例007表示系统响铃) |
\0x7f | 十六禁止表示的ASCII值(此例中7f表示删除键的控制代码) |
\x{2744} | 十六进制表示的Unicode代码点(这里的U+2744表示雪花形状的图形字符) |
\cC | 控制符,也就是Control键的代码(此例表示同事按下Ctrl和C的返回码) |
\ | 反斜线 |
|双引号 | |
\l | 将下一个字母转化为小写的 |
\L | 将它后面的所有字母都转化为小写的,直到\E为止 |
\u | 将下一个字母转为大写的 |
\U | 将它后面的字母都转为大写的,直到\E为止 |
\Q | 相当于把它到\E之间的非单词(non word)字符加上反斜线转义 |
\E | 结束\L,\U和\0开始的作用范围 |
数字与字符串之间的自动转换
通常Perl会根据需要,自动在数字和字符串之间进行类型转换.那它究竟是如何知道炫耀欧数字还是字符串呢?这完全取决于操作符.如果操作符(比如+)需要的是数字,Perl就会将操作数视为数字;在操作符(比如.)需要字符串时,Perl变回将操作数视为字符串.因此,你不用担心数字和操作符之间的差异,只管合理使用操作符,Perl会自动就能够完成剩下的工作.
对数字进行运算的操作符(比如乘法)如果遇到字符串类型的操作数,Perl会自动将字符串转换成等效的十进制浮点数进行运算.字符串中非数字的部分(以及前置的空白符号)会被略过,所以"12fred34" * "3"也会得出36,而不会出现任何警告信息.在最极端的情况下,完全不含数字的字符串会被转换成0.
"前置0"的技巧只对直接量有效,不能用于字符串的自动转换,自动转换总是按照十进制数字来处理的.
标量变量
所谓变量,及时储存一个或多个值的容器的名称.而标量变量,就是单单存储一个值的变量.
Perl程序里面的大部分变量名称都习惯使用全小写,正如你在本书中看到的例子一样,只有少数集中情况中才都会用大大写字母.而使用全大写的(比如ARGV)变量一般都是表示特殊意义的变量.如果变量名不止一个单词,有人喜欢用下划线分开,如underscores_are_cool,也有人喜欢用$giveMeInitialCaps这种风格.当然你也可以使用全部大写的变量名,但这么以来就有可能和Perl保留的特殊变量的名称相冲突.所以最好还是不要用全大写的名称.
用Print输出结果
一般我们都想要程序输出写什么信息来,否则,也许会有人认为它什么事都没做.print操作符就是用来完成这项任务的:它可以接收标量值作为参数,然后不经修饰地将它传送到标准输出(standard output).除非特别指定,否则一般默认的"标准输出",指的就是终端屏幕.
借助代码点创建字符
有时候我们需要输入键盘上没有的那些字符.取得这些字符的方法得看用的是什么系统的输入法或者哪一款文本编辑器.不过,与其非礼寻找字型输入,还不如直接键入这些字符的代码点(code point),再通过chr()函数转换成对应字符来的方便:
反过来,我们可以听过ord()函数把字符转换为代码点
define函数
行输入操作符有时候会返回undef.在一般情况下,它会返回同一行文本.但若没有更多输入,比如读到文件结尾(end-of-file)时,它会返回undef来表示这个状况.要判断某个字符串是undef而不是空字符串,可以使用defined函数.如果是undef,该函数返回假,否则返回真.
列表(list)指的是标量的有序集合,而数组(array)则是储存列表的变量.在Perl里,这两个术语常常混用。不过更精确地说,列表指的是数据,而数组指的是变量。列表的值不一定要放在数组里,但每个数组变量都一定包含一个列表(即使是不含任何元素的空列表)。
因为每个元素都是独立不想管的标量值,所以列表或数组可能包含数字,字符串,undef值或不同类型标量值的混合。
Daily Task
终有一天,你会老去,而我,将会加冕为王!