标量数据
1. Perl内部不存在整数值,全部按双精度浮点数的要求来保存并进行运算。
2. Perl允许直接在整数内插入下划线。123456789 与 123_456_789是一样的。
3. 取模操作先取整后求余,10.5%3.2 同 10%3结果相同
4. 乘幂操作 ** 2**3 为2的3次方
5. Repeat 操作 x “abc” x 3 abc重复3次 abcabcabc
6. 内建警告信息。
a) 命令行: perl –w myprogram
b) 内部指明: #!/usr/bin/perl –w
c) 5.6以上的版本:
#!/usr/bin/perl
Use warnings;
d) 显示警告的详细信息
#!/usr/bin/perl
Use diagnostics; #加载全部说明,系统会变慢
可以选择命令行 perl –Mdiagnostics myprogram
7. Perl变量可被包围使用 print “aaa ${haha}s”;
8. 比较操作符,perl的比较操作符严格区分数字比较和字符串比较
数字 字符串
== eq
!= ne
< lt
> gt
<= le
>= ge
9. 获取用户输入 $line = <STDIN>;
10. 去除行末换行 chomp($text=<STDIN>);
列表与数组
1. 数组 $rock[0] = 1
$rock[1]=2
$rock[90]=90 # 2-89会被分配,定义为undef
$#rock 表示数组最后一个索引值 90
Print $rock[$#rock]; # 90
Print $rock[-1] #90 负向索引
2. 列表直接量
(1,2,3)
(“haha”,2,3)
(1..100) # 100个整数元素
Qw( aa, bb, cc )
3. ($a, $b) = ($b, $a) #变量互换
($a, $b) = qw( ccc ddd eee ) #eee被忽略
@rock = qw(ff rrr zzz) # @表示整个数组
4. 数组内插
@rock = qw( cc dd ee );
Print “@rock”; # 输出字符串,元素间用空格分开
5. Foreach $rock (qw/aa bb cc/)
Foreach $rock (@rocks)
6. $_ 老地方
7. Reverse, sort
8. 清空列表的正确用法 @bety = ();
9. 强制标量转换 scalar
Print “I have”, scalar @rocks, “rocks”;
10. <STDIN>在列表上下文中返回所有剩下的行,每行作为一个元素 @lines = <STDIN>
子程序
1. 定义 sub funcname{}
2. 调用 &funcname
3. 返回值 没有return 自动返回最后一次运算的结果
4. 参数,所有参数自动存储在变量@_中,通过 $_[0], $_[1] 进行访问
5. Use strict
6. 持久性变量(静态变量) state $n = 0;
输入与输出
1. <STDIN>读到行尾会返回undef
2. 钻石操作符 <> 自动读取所有文本
Perl aa.txt bb.txt cc.txt
While( defined($line = <>) ){
Chomp($line);
}
3. 文件句柄
Open FILE “file”
Open FILE “<file”
Open FILE “>file”
Open FILE “>>file”
While (<FILE>) {…..}
Close FILE
4. $! 存储错误信息
5. Die 参数中加/n 可以屏蔽行号和文件名。Die “error info/n”;
6. Warn 提供和die 相似的功能,但不会终止文件运行。
7. 5.10 可使用 say,同print 功能类似,结尾单加换行
哈希
1. $hash{$key}
2. % 整个哈希
3. 胖箭头
My %hash = (
‘a’=>’aaa’,
‘b’=>’bbb’,
‘c’=>’ccc’, #结尾一个多余的逗号
);
4. @key = keys %hash @value = values %hash
5. While( ($key, $value) = each %hash ){ }
6. Exists $hash{“item”} delete $hash{“item”}
7. %ENV 环境变量哈希
正则
1. 避免反向引用二义性。 /g{1}111
2. =~
3. 命名捕捉, 被捕捉的变量自动存储在哈希%+中。
if( $name =~ m/(?<name1>)/w+ (?<name2>/w+)/ ) say “I saw $+{name1} and $+{name2}”
4. $& 存储全部匹配段
$` 存储匹配位置之前的字符
$’ 存储匹配位置之后的字符 # 使用任意一个变量都会使正则匹配变慢
5. s/// 替换
6. /g 全局匹配
7. /U 之后的字符全部转换成大写
/L 之后的字符全部转换成小写
/E 结束/U /L的影响
/l 之后的第一个字符小写
/u之后的第一个字符大写
8. @field = Split /patten/, $str # 会保留开头处的空字段,忽略结尾的空字段。不建议在split用括号做捕捉,可以用(?:)做分组
9. My $str = join $glue, @pieces;
10. 列表上下文的捕获,返回捕获列表
@words = ($text =~ /([a-z])/ig)
11. //m 跨行匹配
12. $^I 与 <> 的配合使用,更新文件
控制结构
1. Last=> break next=>continue
2. Redo 重复本次循环
3. 标签块 跳出多重循环
LINE: while( <> ){
Foreach (split){
Last LINE if /__END__/;
}
}
4. 定义否 // 需要版本5.10
My $v = $a{“b”} // 1 #$a{“b”}未定义则用1赋值
文件测试
1. 虚拟句柄_ if( -r $file and –w $file ) => if( -r $file and –w _ )
2. 栈式文件测试 if( -w –r $file ) #测试顺序从右向左
3. Stat, lstat
4. Localtime
目录操作
1. Glob通配 my @files = glob “*.php *.html”
2. 老式通配 my @files = <*.php *.html>
3. 目录句柄
opendir DIR, $dir or die “….”
While( $name = readdir DIR ) {} #readdir 只返回文件名,并不带路径
4. Unlink # unlink不能用来删除目录
Rename “old” “new”
Link “source” “target” #硬链接
Symlink “source” “target” #软链接
Readlink 取得链接指向的位置
5. 目录
Mkdir “dir”, 0755 #0755 不能写成字符串形式
Mkdir “dir”, oct($permissions);
Rmdir 只能删除空目录
$$ 当前进程号
Chmod 0755 $file
Chown $user, $group, glob “*.o”
字符串
1. Index( $big, $small ) #big里找small首次出现的位置,找不到返回-1
Rindex
2. Substr( $str, $pos, $len )
Substr($str, 0, 5) = ‘hello’ #substr可用来做字符串的部分替换
3. Sprint
4. 高级排序
Sub by_num{ if($a<$b){-1} elsif($a>$b){1} else {0} }
@res = sort by_num @nums #函数回调无需加&
5. 飞碟操作符 sub by_num{ $a<=>$b }
Sub by_num{ $a cmp $b }
@res = sort {$a<=>$b} @nums;
6. 多重排序
Sub by_score_and_name{
$score{$b} <=> $score{$a} or
$a cmp $b
}
7. 智能匹配 ~~ #5.10版本
8. Given-when #5.10版本
Use 5.010;
Given( $var ){
When( $_ ~~ /hello/i ) { say “…..”;continue }
When( $_ == ‘haha’ ) {say “….”; break}
Default { say ‘….” }
}
9. 多项when
Foreach (@names){
When() {}
When() {}
}
进程
1. System 启动子进程,返回0代表成功
2. Exec 当前进程,exec后的代码不再执行
3. 反向引号捕捉结果 $date = `date`;
4. 文件进程
Open DATE “date|” or die …. # date 结果输出到DATE句柄
Open MAIL “|mail user” or die #MAIL句柄的输入传递给mail命令
my $now = <DATE>
print MAIL “hello user”;
close MAIL;
die “$?” if $? #命令返回值存在$?中,0表示成功,非0表示失败
5. Fork
Defined( my $pid = fork ) or die ‘…..” #fork返回非undef ,下一行开始子进程开始执行
Unless($pid){ # 自由父进程的pid不是0
…..
}
Waitpid($pid, 0);#父进程等待子进程结束
其他技巧
1. Eval { }; 用于捕捉错误,结尾必须有分号,如果发生错误,程序停止执行,错误信息保存在$@中
2. Grep 筛选列表
My @odd_num = grep { $_%2 } 1..1000 #能被2整除的被筛选到@odd_num列表中
My @lines = grep /hello/, <FILE>
3. Map 对列表每个元素
My $res = map { &func($_) } @data;
4. 列表切片
My( undef, $var, undef, undef ) = split /:/;
My $time = (stat $file)[9]; #括号为必须
My( $var1, $var2 ) = (split/:/)[1,5];
5. 数组切片
My @names = @all_name[1,2,3];
Print “@all_name[4,5,6]”;# 切片是可以内插的
6. 哈希切片
My @scores = ( $score{“a”}, $score{“b”} );
My @scores = @score( qw/ a b / );
My @list = qw/a b c/;
My @value = (11,22,33);
@score{@list} = @value; # $score{“a”} = 11 $score{“b”} = 22 $score{“c”} = 33