第一章 perl基础
1,更为复杂的散列读和写
a.用不是perl的标准模块Storable。
b.用这句告诉perl用该模块:
use storable qw(nstore retrieve);
表明用到了模块中的两个函数。
c.nstore函数用途是,在一个文件中保存散列,
my $status = nstore \%hash, “file.dat”,如果成功返回true,不成功返回未定义。
2.比较运算符:= 、== 和eq
=表示赋值。
==某变量的是否等于某个值。
eq表示相等
例如:if(“Sun” == “Lee”) 错误
if(“Sun” eq ”Lee”) 正确
3.defined和undef
defined是函数,测试某个变量是否有某个值。
undef不是一个函数,他将变量的值设置成undefined,并在这一过程中返回undefined。
例如:if(undef($value))
{
print “The value is not defined”;
}
这段程序不会输出你想要的结果,不能正常工作。
反而:
if(not defined($value))
{
print “The value is not defined”;
}
这段程序会输出你想要的结果,能正常工作。
这种方法是检测变量是否未定义的方法。
4.“真”的定义
未定义变量为false。
空字符串也为false。
值“0”为false。
其他情况(菲空字符串或非0数字)为true。
经典话语:“真理为判断结果为肯定的任何事物。绝对真理好比最高法院在审判时,9个人中有5个人投赞成票。”
注意:当程序读入一整行(包括新行同时被读入),当程序遇到空行时,行变量值为“\n”而不是“”。
第二章 数组
1.数组的定义:用符号“@”。
例如:@array;
2.数组元素的个数
在遍历数组时,数组元素的个数要用“<=”符号,否则,他会忽略数组的最后一个元素。
注意:表达式@#array返回的是数组的最后一个元素,对于单元数组@#array是等于0的,而对于空数组,则@#array返回-1。
3.几个函数:
(1)push:在数组的末尾添加一个元素。
(2)pop:在数组的最后去掉一个一个元素
(3)shift:在数组的起始处去掉一个元素
(4)unshift:在数组的起始处添加一个元素
4.splice函数
功能:删除或替换数组的一部分,也可以在数组中插入记录。
格式:splice @array, $offset, $length。
返回值:根据上下文不同,他的返回值也有所不同。可以是数组也可以是标量。
5.split函数
功能:分解字符串。
格式:split 分割符,字符串
返回值:数组。
表1
|
表达式 |
解释 |
|---|---|
|
/\t/ |
Tab符号 |
|
/+/ |
一个或多个空格 |
|
/\s+/ |
一个或多个空白符——即空格或TAB |
|
/,/ |
逗号 |
|
/,\s*/ |
逗号,可能后面有0个或多个空白符 |
|
/\n/ |
新行(当字符串包含很多行,而且想将单行分解成数组时有用) |
6.join函数
功能:连接字符串。
格式:join $string, @array
返回值:string
7.@ARGV变量
程序的命令行参数。
得到这个参数使用变量$#ARGV他的的一个参数不是程序的名字,将程序的名字赋给变量$0。
第三章 正则表达式
1.表达式位置:正则表达式放在(//)当中。
例如:/#/
2.匹配预算符:
符号:”=~”。
功能:检查左边的字符串是否与右边的正则表达式匹配。
如果匹配,则,为true,否则,为false。
例如:$line =~ /#/ 表示:一行中是否存在“#”字符。
3.字符串开头符号
符号:“^”。
功能:检查一行的开头。
例如:$line =~ /^#/ 表示:一行的是否以#开始。
注意:可以用符号--/^$/判断一行是否是空行。
例如:$line =~ /^$/ 表示一行的开始即是结束。
如果该行含有一个或多个空格,则应该使用符号--“ *” 表示匹配一个或多个空 格。则上式就边成了--$line =~ /^ *$/--。
4.字符集
符号:[]
常用的: ^--匹配行的开始。
[0-9]--匹配单个数字。
[0-9]*--0个或多个额外的数字。
$--匹配字符串的结尾。
注意:*--0个或多个空格
+--告诉perl重复前一个原子一次或多次。
5.空白符:(\s)
表示:空格和[TAB]。
这样上式就可以变成:$line =~ /^\s*$/
6.使用分组来分解行
符号:“()”--小括号。
注意:(1)/^[a-z]/和/[^a-z]/不同
解释:第一个中的“^”表示在[]范围之外,意思是“行的起始(^)”,后面紧接着是小写字母([a-z])。
第二个中的“^”表示脱字符(^)位于范围指定([])之内,意思是除了后面的小写字母为所有字符。目的是与非小写字母匹配。
(2)美元符号($)有双重意义:
一,在范围指定[]之外,意味着“匹配行未”。
二,在范围指定[]之内,意味着“字面值”。
例如:$line =~ /([^#]*)(#.*)/
解释:第一部分,匹配#之外的任何字符并重复0次或多次,把他赋给$1。
第二部分,散列字符,任何字符(.)重复0次或多次,把他赋给$2。
7.处理可选(|)和限制匹配
符号:|
引例:MACRO = “String with # in it” #注释
象这样的怎么办?
命令要素: 非#的任何字符。
一个引用字符串。
或者其一,或者两者重复0或多次。
例如:$line =~ /^(([^#”]*|“.*”)*)(#.*)/
改版一:$line =~ /^((?:[^#”]*|”.#”)*)(#.*)/
其中“?:”表示不要把结果放到$<number>变量中。
改版二:$line =~ /^((?:[^#”]*|”.#?”)*)(#.*)/
其中第二个“?”表示匹配尽量少的部分。
8.条件匹配
引例:MACRO=”String with \” in it” #注释
解决方案:如果(...条件...)不匹配。
术语:“取反后视断言”。
命令要素: 一个起始引号(”)。
0或多个内部字符(.*)。
仅当...时发挥作用的结束引号(”)。
他的前面不是一个\(?<!\\)。
改版三:$line =~ /^((?:[^#”]*|”.#?(?<!\\)”)*)(#.*)/
改版四:$line =~ /^((?:[^#”]*|”.#?(?<!\\)”)*)(\#.*)/x
其中:x—表示可扩展的正则表达式,即,允许在正则表达式中注释。
注意:不能在正则表达式注释中使用符号\。
9.替换
符号:s//<flag>$line =~ /^((?:[^#”]*|”.#?(?<!\\)”)*)(#.*)/
格式:$line =~ s/<old>/<new>/<flag>
其中:<flag>可以是g、i等。
g表示尽可能多的执行替换。
i表示执行匹配时忽略大小写。