getops
Perl语言入门(第四版) notes
Perl原则
Perl 没有长度的限制,只要你有足够的内存。Perl 的设计哲学,“没有不必要的限制”。String
正如Perl 格言中所说: 做一件事不只一种方法(“There’s More Than One Way To Do It”). Qw
这在Perl 中是一条通用规则:如果去掉括号含义不变,那括号就是可选的。
第一章概述
Perl 擅长写那些需要在短时间内完成的程序。
Perl 被设计为:90%处理文本,10%针对其它情况。
CPAN Comprehensive PerlArchive Network http://serach.cpan.org/ http://kobesearch.cpan.org
http://perldoc.perl.org http://www.perldoc.org
第二章标量数据
2.1 数字
2.1.1 所有数字内部的格式一致
Perl都把它们当作双精度浮点数来处理. 这就是说在Perl 内部没有整数值。
2.1.2 浮点数
有或没有小数点的数字都是允许的(包括+或-号),也可带一个十进制的指数(符号为E)。-6.5e24
2.1.3 整数
Perl 允许用下划线来分隔: 61_298_040_283_768
2.1.4 非十进制整数
八进制以0 开头,十六进制以0x 开头,二进制0b 开头:0377, 0xff, 0b11111111. (这三个数在Perl 中都代表同一个数255)
当一个非十进制的数字超过4 位时,读起来将很困难。由于这个理由,Perl 允许你使用下划线来区分:0x1377_0B77
2.1.5 数字操作符
加(+),减(-),乘(*),除(/)
模数运算符(%): 两个操作数首先变成它们对应的整数值,如10.5%3.2 转换为10%3
指数操作符由两个*号表示,如2**3,表示2 的3 次方,等于8.
◆注意,在模数运算中,如果有一个操作数为负数,那其结果和Perl 的具体实现相关。
◆通常不能进行一个负数的非整数次方的运算。对数学有一定了解的读者知道,这将产生一个复数(数学概念中的复数:如1+2i,译注)。
如果想进行类似的预算,你需要Math::Complex 这个模块
2.2 字符串
最长的字符串,可以填满整个内存。这符合Perl 的哲学,只要有可能就不加任何内嵌的限制。
有两种类型的字符串:单引号字符串和双引号字符串。
2.2.1 单引号字符串
除了单引号,或者反斜线(包括换行字符,如果字符串在下一行继续)之外的任何字符都表示它自身。
单引号字符串中的\n 不会被当作换行符来处理,其仅仅是两个字符\和n。只有在反斜线(\)后面接的是\或单引号’,其才会被当作特殊符号来处理。
2.2.2 双引号字符串
如果想\和之后的字符成为转义字符(如\n 表示新行),应当使用双引号。
表2-1 双引号字符串中的转义符
\L 接着的字符均小写直到\E
双引号字符串另一个性质是可进行变量内插.
2.3.3 字符串操作符
字符串可由. 操作符连.
一个特殊的操作符是字符串重复操作符(string repetition operator),由小写的字母x 表示。“fred”x 3 # “fredfredfred” 5 x 4 #实际上是“5”x 4, “5555”
复制次数(右操作数)在使用之前会把它转换为小于等于它的整数(如,4.8 变为4)。重复次数小于1 将产生空串(长度为0)。
2.2.4 数字和字符串之间的自动转换
大多数情况下,Perl 将在需要的时候自动在数字和字符串之间转换。这完全依赖于标量值之间的的操作符。
当在需要数字的地方使用了字符串: “12fred34”* “3”将给出36 而不会用任何提示.
需要字符串的地方使用了数字: “Z”. 5 * 7 #同于“Z”. 35,或“Z35”
2.3 Perl 内嵌的警告(warnings)
使用–w 这个参数把警告打开:$ perl –w my_program or #! /usr/bin/perl –w or
use warnings;
use diagnostics;# 更详细的信息
另一种优化方法是,在命令行中使用–M 这个参数: $ perl–Mdiagnostics ./my_program
2.4 标量变量
由$开头
大小写是严格区分的
2.4.3 二元赋值操作符
$fred+=5;
$str .= “”’
2.5 print 输出
2.5.1 字符串中标量变量的内插
变量名分隔符:花括号({})。”${what}s.”
2.5.2 操作符优先级和结合性
表2-2 操作符的优先级和结合性(由高到低)
2.5.3 比较运算符
< <= = = >= !=
有趣的字符串比较符:lt le eq ge gt ne。
表2-3 数字和字符串的比较运算符
比较关系 数字 字符串
相等 = = eq
不等 != ne
小于 < Lt
大于 > gt
小于或等于 <= le
大于或等于 >= ge
2.6 if 控制结构
2.6.1 Boolean 值
Perl 不同于其它的一些语言,它没有Boolean 类型。
● 如果值为数字, 0 是false;其余为真
● 如果值为字符串,则空串(‘’)为false;其余为真
● 如果值的类型既不是数字又不是字符串,则将其转换为数字或字符串后再利用上述规则。undef为false.
2.7 用户输入
<STDIN>
2.8 chomp 操作
如果字符串结尾有换行符,chomp可以去掉它。chomp ($text = <STDIN>); #读入,但不含换行符
chomp 是一个函数。作为一个函数,它有一个返回值,为移除的字符的个数。
这又是Perl 中的一条通用规则:除非移除它们时含义会变,否则括号是可以省略的。如果结尾有两个或两个以上的换行符,chomp 仅去掉一个。如果没有,那什么也不做,返回0。
2.9 while 控制结构
2.10 undef 值
undef 既非数字也非字符串,它是另一种标量类型。undef 在需要数字的地方可以自动转化为0,如果是“字符串”,则表现为空串。如到了文件的结尾,则返回undef
2.1.1 defined 函数
要分辨其是undef 还是空串,可以使用defined 函数,它将在为undef 时返回false,其余返回true。
第三章列表和数组
列表是指数据,而数组是其变量名。
3.1 访问数组元素
$fred[0]
如果下标超出了数组的范围,则其值为undef。
3.2 特殊的数组索引
最后一个元素的索引为$#rocks(最后一个元素的索引值要比其实际包含的元素个数少一)。
负数索引值是-1(最后一个元素). 实际上,几乎没有人使用除了-1 之外的其它的负数索引值。
3.3 列表
数组是由括号括起来并且其元素由逗号分隔开的列表.
范围操作符(range operator)..,它创建了从左值到右值之间所有值的列表。(1 ..5)
(5 ..1) #空列表— ..中的左值应小于右值,否则为空
列表中的元素并非必须是常数,也可以是在执行此语句时再计算值的表达式. ($m,17)
3.3.1 qw 简写
“quoted words”或者“quoted by whitespace”
Perl 将它们当作单引号字符串处理,你不能像双引号那样在qw 中使用\n 和$fred. qw(fred barney betty wilma dino )
whitespace(空格,像spaces,tabs,newlines 等字符串)将被忽略,剩下的组成了列表的元素。qw# fred barney betty wilma dino #
3.4 列表赋值
列表值也可以赋给变量:($fred, $barney, $dino) = (“flintstone”, “rubble”, undef);
在数组名前加@(后没有中括号)来引用整个数组。读作“all of the(所有的)”.
◆Larry 声称选择美元符号($)和@符号的原因是,可以分别读做$calar(scalar)和@arry(array)。
没有赋值的数组变量的值为( ),空表。和未初始化的标量变量为undef 类似,未被初始化的数组为空表。
3.4.1 pop 和push 操作
push 的第一个参数或者pop 的唯一参数必须是数组变量。
@array = 5..9;
$fred = pop(@array); #$fred 得到9,@array 现在为(5,6,7,8)
如果数组为空,那pop 什么也不做(因为没有元素可以移出),并返回undef。
push 的第一个参数或者pop 的唯一参数必须是数组变量。
3.4.2 shift 和unshift 操作
nshift 和shift 对一个数组的开头进行操作.
3.5 将数组插入字符串
插入的数组元素会自动由空格分开
3.6 foreach 控制结构
foreach 从列表的第一个元素一直循环执行到最后一个元素,一次迭代一个: foreach $rocks(@rocks){…}
循环结束时,变量的值会回到循环开始前,如果没有值则为undef。这意味着如果有一个变量和控制变量有相同的名字:“$rock”,不用担心会混淆它们
3.6.1 Perl 最常用的默认变量:$_
如果在foreach 循环中省略了控制变量,那Perl 会使用其默认的变量:$_。
foreach(1..10){ #使用默认的变量$_
print “I can count to $_!\n”;
}
3.6.2 reverse 操作
reverse(逆转)操作将输入的一串列表(可能是数组)按相反的顺序返回。
注意reverse 返回逆转的列表,它不会改变其参数的值。@fred = reverse @fred;
3.6.3 sort 操作
sort 操作将输入的一串列表(可能是数组)根据内部的字符顺序进行排序。
3.7 标量和列表上下文
3.7.2 在列表Context 中使用Scalar-Producing 表达式
如果一个表达式不是列表值,则标量值自动转换为一个元素的列表:@fred = 6*7;
由于undef 是一个标量值,将undef 赋给数组不会清空数组。一个更好的方法是将空列表赋给它.
3.7.3 强制转换为标量Context
可以使用函数scalar。scalar @rocks
3.8<STDIN>在列表Context 中
<STDIN>在标量context 中返回输入的下一行。在列表context 中,它将返回这个输入文件的所有剩余部分。而每一行将作为一个独立的元素:
@lines = <STDIN>; #将输入读入列表context 中
chomp (@lines = <STDIN>); #读入所有的行,不包括换行符
第四章子程序
5.3 调用参数
技术上讲,<>从数组@ARGV 中得到调用参数。
<>操作查看@argv 来决定使用哪些文件。如果表为空,则使用标准输入流;否则,使用其找到的相应文件。
@argv = qw# larry mor curly #; #强制使用这三个文件
while(<>){…}
5.5 使用printf 格式化输出
%g要输出数字,通常使用
%d 为十进制◆整数,根据需要而截尾:
%s 是针对字符串的%x 是针对十六进制的,%o 是针对八进制的。
printf 中的数据通常会接受一个宽度值。如果数据不能满足这个宽度,则会自动扩展开来:
如果宽度值为负数,则为左对齐(对于所有的格式符):print “%-15s\n”, “flintstone”; #输出为flintstone○○○○
%f 根据需要进行截尾,你可以设置需要几位小数点后面的数字:printf “%12f\n”, 6*7 + 2/3; #输出为: ○○○42.666667
要输出一个百分号,可以使用%%,它不会使用后面列表中的元素. “\%”不能正确工作.
5.6 句柄
Perl 自身有六个文件句柄:STDIN,STDOUT,STDERR,DATA,ARGV,ARGVOUT