寒假期间看了一本关于Perl的入门书籍,感觉不错,下面是一些读书笔记:
你将看到整数(如255,2001 等)和浮点数(有小数点的实数,如3.14159,1.35x1025),但在内部,Perl 都把它们当作双精度浮点数来处理
61298040283768,Perl 允许用下划线来分隔它,因此可以像下面这样书写:61_298_040_283_768
和C,C++不同,Perl 中NUL 字符没有特殊的含义。Perl 能计算长度,不用靠null 来判断字符串是否结束。
单引号字符串中的\n 不会被当作换行符来处理,其仅仅是两个字符\和n。只有在反斜线(\)后面接的是\或单引号’,其才会被当作特殊符号来处理。
一个特殊的操作符是字符串重复操作符(string repetition operator),由小写的字母x 表示。
“fred”x 3 #“fredfredfred”
“barney”x (4+1) # “barney”x 5, “barneybarneybarneybarneybarney”
5 x 4 #实际上是“5”x 4, “5555”
标量变量在Perl 中由$开头
列表和数组可以包含任意数量的元素。最少含有0 元素,最多可以填满你的可用内存。这里又体现了Perl 的设计哲学,“没有不必要的限制”。
rocks 数组,其最后一个元素的索引为$#rocks
Larry 提供了一种简便方法:数组的负数索引值从最后一个元素开始
负数索引值是-1表示最后一个元素
一个给定的表达式在不同的上下文中其含义是不同的。
$fred = something; # 标量context
@pebbles = something; #列表context
($wilma,$betty) = something; #列表context
($dino) = something; #列表context
当Perl 遍历此子程序时,将会计算每一步的值。此子程序中最后计算的值将被返回。
这是Unix中很少人知道的一个事实:如许多标准的工具,如cat,sed,也使用这种约定,连接号(-)代表标准输入流。
技术上讲,<>从数组@ARGV 中得到调用参数。
printf“The items are:\n”. (“%10s\n”x @items), @items;
程序的名字在Perl 的特殊变量$0 中
只有Perl 成功的重新打开新的连接,否则是不会关闭以前的连接。
要引用整个hash,使用百分号(“%”)作为前缀
使用delete 后,hash 中将不会存在此key;如果其值是udnef,则key 是存在的。
不要将正则表达式和shell 中的文件名匹配模式,globs 混淆了.
Perl 中,注释可以被作为空白
使用绑定操作符(=~)将告诉Perl 将右边的模式在左边的字符串上进行匹配,而非对$_匹配。
@fields = split /:/,“abc:def::g:h”; #得到(“abc”, “def”, “”, “g”, “h”)
这里有一条规则:开头的空元素会被返回,但结尾的空元素被丢弃
@fields = split /:/, “:::a:b:c:::”; #得到(“”, “”, “”, “a”, “b”, “c”);
默认时,split 对$_操作,模式为空白:
my @fields = split; #同split /\s+/, $_;
如果没有指定文件名,则其从标准输入流中自动打开和关闭一系列文件进行读入。如果$^I中有字符串,这个字符串则会成为备份文件的扩展名。
?号在正则表达式中的第四种用法:问号,表示0 或1 的数量词,非贪婪修饰符,现在是开头符
条件表达式也是先被求值的,虽然被放在后面
last 会立刻结束循环。(这同C 语言或其它语言中的“break”语句类似)
可以使用last 从“裸的”代码块中跳出。
next 之后,又会进入下一轮循环(这和C 或者类似语言的“continue”相似)
redo会调到当前循环块的顶端,不进行条件表达式判断以及接着本次循环。
标签在整块之前使用;不是针对代码中的某些点
-T和-B分别检测一个文件是文本的还是二进制,那Perl是怎样知道的呢?答案是Perl欺骗了我们:它打开一个文件,查看前面几千个字节,进行合理的猜测。如果没有太多的怪异符号,则其像文本
每当在程序中使用stat, lstat,或文件检测(file test)时,Perl 就会要求系统分配一块stat buffer给文件(也就是,stat系统调用所返回的buffer)。这就意味着如果想知道文件是否是可读且可写的,需要对相同的信息进行两次系统调用
这暗示了一个目录的连接数等于2 (.和..)加上其包含的子目录的个数。
在Perl 中,环境变量可以通过%ENV 这个hash 变量得到
对于system和exec,其输出的结果传到Perl标准输出的地方。有时,将其结果作为字符串保留下来以便进一步处理是很有趣的。这可以通过使用反引号(`)而非单引号或者双引号做到
Perl 提供了处理严重错误的方法:将这些代码放入eval 块中
eval 是一个表达式(不是像while 或foreach 那样的控制结构),因此结尾处的分号是必须的。
如果eval 捕捉到了严重错误,则返回值为undef 或空列表,依赖于其context
如果将列表的一个元素被赋给undef,则意味着忽略此元素:
my(undef, $card_num, undef, undef, undef, $count) = split /:/;
同array slice一样,(hash slice)变量前的符号($或@符号)决定了下标表达式的context。如果前面是$符号,则下标表达式是在标量context 中被求值,得到一个值◆。如果之前为@符号,则下标表达式在列表context 中被求值,得到一列值。