Sky对《Perl语言入门 第六版(中文版)》的笔记(94)
Sky (好好读书,认真笔记!)
-
第30页 标量数据
Perl里面有个非常重要的概念——标量(scalar)。他是Perl中单个事物的单位。 对于大部分标量来说,他要么是数字,要么是字符串(在其他编程语言中,hello是5个字符的集合,而不是单个事物,但在Perl中,她就是一个独立的标量值)。 对于Perl中的数字标量,在Perl内部,是没有整型这一说的,所有的整数和浮点数,都是按照“双精度浮点数”的要求来保存和运算的。
-
第32页 整数直接量
或者我个人认为,直接量(literal)这个东西翻译成字面量可能更自然一些。 Perl允许在整数直接量中插入下划线作为分割(注意:在浮点数直接量中,没有提到过这种用法),这样可以是整数本身的可读性更好一点。用书中举到的例子就是:61298040283768可以被写成这个样子 61_298_040_283_768。
非十进制的整数直接量 引自 整数直接量 非十进制的表示法,基本上是以“前置零”(leading zero)作为标识的。最常见八进制和十六进制的表示法和Java语言是一样的:分别以0和0x作为数字的前缀。但是Perl本身还支持二进制的数字表示法(以0b开头,这里b就是binary了缩写了),这点是Java不支持的。 这里不要忘记,非十进制整数也是整数,所以也支持上面的那个以下划线分割数字的形式。
数字操作符 引自 整数直接量 普通的加减乘除和取模和其他编程语言没有差别,这里不强调了。值得注意的有如下两点:1、关于非整数取模运算,会将非整数转换成整数之后,再进行取模运算。比如:10.5%3.2和10%3的结果是一样的;2、可以使用双星号(**)表示乘幂操作符,比如:2**3=8,表示的就是求2的3次方的大小。
-
第33页 字符串
Perl的字符串可以包含任何字符,所以他有点比较牛逼的功能是,居然可以操控二进制数据。比如,你可以将一个图形文件或者编译过的可执行文件读进Perl的字符串变量,修改他的内容之后,再写回去。 Perl虽然完全支持Unicode,但是由于历史原因,他不会将程序源代码当作Unicode的文本文件读入。所以如果你需要在源代码中使用Unicode书写直接量的话,得手工加上utf8编译指令:
use utf8;
关于字符串的单引号和双引号表示的区别,跟shell很像,基本原则也是:单引号里是啥就是啥(当然特殊字符还是可以通过加入\进行转义表示的)。双引号里面就包括变量替换和各种转义字符的运用了(关于Perl的转义字符,35页有个简单的列表,可以参考)。
-
第36页 字符串操作符
两个操作符很有意思: 1、连接操作符:和Java里面的+功能类似,但是在Perl中用“.”。 2、重复操作符:这个比较特殊,用x表示,没有在其他编程语言中看到过。直接看书里的例子吧:
"fred" x 3 #"fredfredfred" "barney" x (4+1) #就是"barney" x 5,所以结果就是:"barneybarneybarneybarneybarney" 5 x 4.8 # 本质上是"5" x 4,所以最终结果是:"5555"
最后一个例子有点意思,怎么推出的上面的注释里面说的“本质上”的结论呢? 因为x是字符串的操作符,所以这里5会被当作"5"而不是数字5,然后x右侧需要整数,于是4.8被转换成了4,于是就有了上面的注释里面解释的形式了。 这里需要注意的是:重复数字(x右侧的数字)小于1时,会生成长度为0的空字符串。
数字与字符串之间的自动转换 引自 字符串操作符 基本原则就是根据操作符,推断出scalar是数字还是字符串。比如:"."是字符串操作符;还有上面例子的5 x 4.8;而"+"是数字的加法,所以两边应该是数字。书里面关于字符串自动转换成数字的例子可以留意一下:
"12" * "3" # 36 "12fred34" * " 3" # 36,这种转换不会给出警告信息。
-
第37页 Perl的内置警告信息
可以通过如下方式开启(警告只是给程序员输出提示信息,不会影响程序的正常执行路径):
#!/usr/bin/perl use warnings;
or
perl -w my_program
or
#!/usr/bin/perl-w
上面只是给出简单警告信息,但是如果你需要详细错误提示的话,可以加入diagnostics模块,加入的方式也主要有如下两种:
#!/usr/bin/perl use diagnostics;
or
perl -Mdiagnostics my_program
这里,如果加载如上诊断模块会使程序启动变慢,因为需要预加载该模块进内存。
-
第40页 标量的赋值
其实熟悉shell的人,看到Perl的标量变量的概念是不会陌生的。但是关于标量的赋值却要小心了,就是在Perl中,标量被赋值时,依然需要$符号作为前缀对标量进行引用的(而且等号左右两边是可以有空格的),shell中是不需要$的,直接看例子吧:
$fred = 17; $barney = 'hello'; # 'hello' $barney = $fred + 3; # 20 $barney = $barney * 2; #40
双目赋值操作符 引自 标量的赋值 这个没有带多的特殊性,和Java、C的语法非常类似,直接看例子,下面的两个写法是等效的:
$fred = $fred + 5; $fred += 5;
这里,甚至字符串的连接操作符也可以修改成这样的形式:
$str = $str. " "; $str .= " ";
-
第43页 借助代码点创建字符
基本需求是有些字符在键盘上根本找不到对应的键位,也就意味着你没法输入。 Perl中,一种可行的方案是先找到这些特殊符号对应的Unicode的code point,然后借助chr()函数(入参是16进制数字)转换成对应的字符:
$alef = chr( 0x05D0 ); $alpha = chr( hex('03B1') ); $omega = chr( 0x03C9 );
如果并不需要变量存储由code point转换得到的字符,而是直接使用的话,到时还有如下这种快捷方式(直接通过\x{}):
"\x{03B1}\x{03C9}";
反过来,我们可以通过ord()函数把一个字符转换成一个code point,如下:
$code_point = ord( '? ' );
-
第46页 比较操作符
Perl的比较操作符和shell的比较操作符有点类似,都是对于数字和字符串提供两套符号,不过使用的场景刚好反过来了(而且perl中不需要中划线-作为字母缩写形式的前缀了,比如-lt),Perl的使用场景是下面这样的: 1、数字比较符:
== != < > <= >=
2、字符串比较符:
eq ne lt gt le ge
布尔值 引自 比较操作符 Perl里面的默认布尔值跟shell也不同。Perl有如下规定: 1、对于数字,0为假,其他都为真。 2、如果是字符串,空字符串('')为假,其他所有字符串都为真。(但'0'是个例外) 3、如果既不是数字也不是字符串,那就先转换成数字或者字符串之后再按照上述规则判断。
-
第48页 获取用户输入
这个符号就有点怪异了,是:<STDIN>,直接看例子好了:
$line = <STDIN>; if ($line eq "\n") { print "That was just a blank line!\n"; }else { print "That line input was : $line"; }
chomp操作符 引自 获取用户输入 chomp()本质上是个函数,入参只能是字符串,作用就是去除字符串结尾的换行符,如果存在换行符的话。 这里需要注意的是,如果字符串结尾有多个换行符的时候,该函数只会去掉最后一个换行符。
-
第50页 undef值
undef是除了数字、字符串之外的另一种标量。他被当作数字使用时相当于数字的0,当作字符串使用时相当于字符串的空串('')。
defined函数 引自 undef值 判断一个字符串到底是空串还是undef的方法。前者返回true,后者则为false。