/*
所有笔记都是根据个人对某知识点了解程度而做适当记录,以备复习。不是针对某知识点系统记录、讲解。
*/
1、last相当于break next相当于continue
2、“真”的定义
A、未定义的变量为false
B、空字符创为false
C、值为0为false
D、其他情况为真
3、defined函数测试变量是否有某个值。
4、简单关系运算符
== eq
!= ne
< lt
<= le
> gt
>= ge
5、十六进制表时必须用0x,而不能用0X。(x的大小写区别)
6、perl允许在数字中使用下划线 eg:1_333_258
7、在双引号中分离变量,可使用{}
8、perl运算符:
. 字符串串联 eg: $full_name = $first." ".$last
** 幂 eg: $div = 12**2
x 重复 eg: $no = "no" x 3
9、open如果打开成功,返回true,否则返回undef
10、从文件读入空行时,读入的是\n,而不是“”
11、在线文档
perldoc -f chomp
perldoc -f defined
perldoc perlsyn #基本语法信息
perldoc perllop #关于perl运算符的信息
12、决定数组中的元素个数:$#array
注意注意:表达式$#array返回的是数组的最后元素的索引。对于单元素数组,$#array 返回0. 对于空数组,$#array返回-1.
eg:for(my $index = 0; $index <= $#array; $index++); 使用 <= 而不是 <
13、带有“黑洞”的数组
my @array = (1); $array[3] = 100;
@array元素为(1,undef,100);
14、引用词常犯错误
my @name = qw(xin lang shen zhen); #qw列表中不能有逗号
15、操纵数组结尾
push(@array,1); #数组结尾插入1
$last_element = pop(@array); #pop数组最后一元素
$first_element = shit(@array); #pop数组第一个元素
unshit(@array,1); #数组开头插入1元素
16、处理数组的一部分:
A、使用一套索引:
@array[0,$#array] = (-1,-1); #将数组的第一个元素和最后一个元素赋值为-1
@array = qw(1 2 3 4); @new_array = @array[0,3];#@new_array 元素为1、4
B、范围运算符:
@array[0..9] = ((0) x 10); #@array头10个元素被赋值为0
17、splice函数
A、splice @array,$offset; #删除数组中元素,从offset开始一直到数组结尾,如果 $offset 为负数,则从数组末尾开始数元素
B、splice @array,$offset,$length; #length 为删除的数组个数
C、splice @array,$length,REPLACEMENTS; #REPLACEMENTS可以是标量列表或者是数组表达式
18、split函数
my $record = "xin:lang:love:shen:zhen";
my @split = split /:/,$record; #以 : 分割 $record 采用//是因为它是一个正则表达式
结果为:@split = qw(xin lang love shen zhen);
19、join 函数:作用与 split 相反:
$result = join("***",@array);#将@array元素用***联合起来
20、正则表达式元素 ^ 匹配行的起始 \s 匹配空白字符 \d 匹配一个数字 *? 重复0或多次,但尽少量的匹配 21、 perldoc perlre perl关于正则表达式的在线文档 perldoc perlop perl的运算符(如s///运算)的文档 perldoc perldebguts 关于perl内部的调试信息 22、 foreach $element (@array){} 注意:$element实际上是一个对数组元素的引用,对$element的改变就是对@array的改变 23、文件测试运算符 -f 是否为一个普通文件 -r 文件可读 -w 文件可写 -x 文件可执行 -d 文件为一个目录 可用 perldoc -f -r 查询,即把文件测试运算符当函数 24、redo运算符 读入一个名字列表,并将它们保存在一个数组中,如果用户输入空行,则重新输入。 for(my $index = 1; $index < 10; $index++){ print "Enter name number $index:"; my $result = <STDIN>; chomp($result); #如果用户输入一个空行,则再给一次机会 if($result eq ""){ redo; } $name_list[$index-1] = $result; } 25、翻译运算符 tr $hex =~ tr/!@#/123/; 如果 $hex 为Q!W@E#,则其结果为Q1W2E3. 26、unless 等价于 if not 27、__DATA__文件 这个指令告诉perl后面的内容不是脚本的一部分,而是在脚本中用于数据的一个特殊位置,它可以使用<DATA>文件句柄按一个普通文件来读。 eg: use strict; use warnings; while(<DATA>){ print; } __DATA__ Hello,I am doing a test. 结果输出:Hello,I am doing a test. 28、<>文件定义: * 如果在 @ARGV 中有一个参数,则<>将每个参数当做一个文件名,并按顺序读入; * 如果 @ARGV 为空,则<>读取标准输入。 eg: 程序清单 Ques28.pl ---------------------------------- use strict; use warnings; my $line; while($line = <>){ print $line; } ---------------------------------- 然后按下面指令来运行:perl Quse28.pl test1.txt test2.txt 结果:将test1.txt test2.txt两个脚本的内容输出 =====================散列、引用和复杂数据结构================== 29、散列初始化之一: my %fix_words = ( beleive => "believe", admimstration => "administration", skool => "school" ); 30、遍历散列 foreach my $cur_key(sort keys %fix_words){ print "$cur_key:$fix_words{$cur_key}\n"; } 31、 ================code start================ use strict; use warnings; my @array = qw!xin ling ye wu!; my %my_hash; %my_hash = map +($_ => 1),@array; foreach (sort keys %my_hash){ print "$_ => $my_hash{$_}\n"; } ================code end================== 解析: map函数一般形式: map expression,array;#对array中的每个元素进行expression操作 为什么 map后面出现 +(加号)?,这是告诉 map,其有两个参数,分别为$_ => 1 和 @array,否则map将误认为自己只有一个参数,即 $_ => 1.其他的自己琢磨 32、散列元素删除 delete $hash{$key}; 33、散列和数组可以相互赋值 my %hash =( sam => 45, joe => 57, mac => 68 ); my @array = %hash; @array 元素为sam 45 joe 57 mac 68.注意:顺序可能不一样,因为在散列中没有定义键顺序。 34、引用(用反斜杠表示 \) my $var = 1; my $ref = \$var; $$ref = 2; print $var;#值为2 #注意:应用被引用的实际标量,需要再添加一个$,即$$ref。 #数组引用: my @array = qw(red white blue); my $ref = \@array; $$ref[$#$ref];#最后一个元素 35、散列的引用 ================= code start=============== use strict; use warnings; my $ref = {xin=>23,ling=>24,ye=>28}; print $$ref{xin};#注意两个$$ ================= code end================= 36、数组的引用 my @array = qw(xin lang shen zhen); $ref = [@array];#方括号用于创建一个数组的拷贝,并返回一个对它的引用 $$ref[1] = "test"; print "@array\n";#输出 xin lang shen zhen print $$ref[0]."\n";#xin print $$ref[1]."\n";#test print $$ref[2]."\n";#shen print $$ref[3]."\n";#zhen ###############################3 $ref = \@array; $$ref[1] = "test";#对array的完全引用 print @array;#xin test shen zhen my $ref = ["red","white","black"];#匿名引用的其他方法 37、散列放到数组里 my @hash_array; $hash_array[0] = {xin=>24,ling=>25}; $hash_array[1] = {shenzhen=>perfect,guangzhou=>good}; print $hash_array[0]{xin}; #24 print $hash_array[1]{guangzhou};#good 38、打印复杂数据结构 require "dumpvar.pl"#放在程序顶部的附近,放在use行后面 dumoValue(reference);#调用,如dumpValue(\@array); ================= code start=============== use strict; use warnings; require "dumpvar.pl"; my @matrix = ( [qw(xin lang)], [qw(ling xi mei)], [qw(live in shen zhen ping zhou)] ); dumpValue(\@matrix); ================= code end================= result: 0 ARRAY(0x85de1c) 0 'xin' 1 'lang' 1 ARRAY(0x85de8c) 0 'ling' 1 'xi' 2 'mei' 2 ARRAY(0x1d28f34) 0 'live' 1 'in' 2 'shen' 3 'zhen' 4 'ping' 5 'zhou' 39、code test ================= code start=============== use strict; use warnings; require "dumpvar.pl"; my @matrix = ( [qw(xin lang work in zhong ruan guo ji)], [qw(live in shen zhen ping zhou)], ); print '$#matrix:'.$#matrix."\n"; #行数 print '$#{matrix[0]}:'.$#{$matrix[0]}."\n"; #列数 print '$#{matrix[1]}:'.$#{$matrix[1]}."\n"; print '$#{matrix[2]}:'.$#{$matrix[2]}."\n"; ================= code end================= result: $#matrix:2 $#{matrix[0]}:7 $#{matrix[1]}:2 $#{matrix[2]}:5 40、my @new_array = @old_array;#引用被复制,而数据没被复制,对@new_array的修改就是对@old_array修改 考虑使用 Storable 模块,函数 dclone 克隆一个复杂的数据结构,生成一个所有引用的拷贝。它带有一个参数,一个对即将克隆数据的引用,并返回一个对数据拷贝的引用。 ================= code start=============== use strict; use warnings; require "dumpvar.pl"; use Storable qw(dclone); my @old_array = qw(hua wei in shen zhen); my $new_array_ref = dclone(\@old_array); print "@old_array\n"; dumpValue($new_array_ref); ================= code end================= result: hua wei in shen zhen 0 'hua' 1 'wei' 2 'in' 3 'shen' 4 'zhen' 41、在线文档 perldoc perdata #关于perl数据结构的信息 模块: Storable #保存和从文件读取复杂数据结构的perl模块 dumpvar.pl #一个用于倾倒变量未编进文档的模块 =====================子程序和模块================== 42、参数定义字符 $ 标量 \@ 数组(转换成引用) \% 散列(转换成引用) & 函数引用 @ 数组(必须为最后一个) % 散列(必须为最后一个) ; 表示后面是可选参数 43、其他参数传递方法 sub distance($$$$){ my ($x1,$x2,$x3,$x4) = @_; } 无参数定义的函数:如sub do_it{},这告诉perl函数带有任何类型的任何数量的参数。换句话说,绝对不进行类型检查。也没有数组到数组引用或散列到散列引用的自动转换发生,所有参数都被串联到一起,倾倒入@_.避免使用这种形式的参数传递。 44、local声明的作用: @@@:保存变量的全局定义 @@@:允许你随意改变变量 @@@:当局部变量越出作用域时,它就恢复全局定义 my才是创建局部变量,local不是。 ================= code start=============== print "$#ARGV arguments present\n"; { local @ARGV; my $first = shift @ARGV; print "$#ARGV arguments present now\n"; } print "$#ARGV arguments restored\n"; ================= code end================= 等价于: ================= code start=============== print "$#ARGV arguments present\n"; my @save_argv = @ARGV; { my $first = shift @ARGV; print "$#ARGV arguments present now\n"; } @ARGV = @save_argv; print "$#ARGV arguments restored\n"; ================= code end=================