1. perl变量类型
类型 | 字符 | 例子 | 用于哪种名字 |
标量 | $ | $cents | 一个独立的数值(数字或字串) |
数组 | @ | @large | 一列数值,用编号做键字 |
散列 | % | %interest | 一组数值,用字串做键字 |
子过程 | & | &how | 一段可以调用的 Perl 代码 |
类型团 | * | *struck | 所有叫 struck 的东西 |
标量:
构造 | 含义 |
$days | 简单标量值 $days |
$days[28] | 数组 @days 的第二十九个元素 |
$days{'Feb'} | 散列 %days 的“Feb”值 |
构造 | 含义 |
${days} | 和 $days 一样,不过在字母数字前面不易混淆 |
$Dog::days | 在 Dog 包里面的不同的 $days 变量 |
$#days | 数组 @days 的最后一个索引 |
$days->[28] | $days一个引用指向的数组的第二十九个元素 |
$days[0][2] | 多维数组 |
$days{200}{'Feb'} | 多维散列 |
$days{2000,'Feb'} | 多维散列枚举 |
数字:
$x = 4_294_967_296;可以用"_"来分割
字符串:
代码 | 含义 |
\u | 强迫下一个字符为大写(Unicode里的“标题”) |
\l | 强制下一个字符小写 |
\U | 强制后面所有字符大写 |
\L | 强制后面所有字符小写 |
\Q | 所有后面的非字母数字字符加反斜杠 |
\E | 结束\U,\L,或\Q。 |
{}的分割作用
引用构造:
常用 | 通用 | 含义 | 替换 |
' ' | q// | 文本字串 | 否 |
" " | qq// | 文本字串 | 是 |
` ` | qx// | 执行命令 | 是 |
() | qw// | 单词数组 | 否 |
// | m// | 模式匹配 | 是 |
s/// | s/// | 模式替换 | 是 |
y/// | tr/// | 字符转换 | 否 |
" " | qr// | 正则表达式 | 是 |
数组:
构造 | 含义 |
@days | 包含($days[0],$days[1],...$days[n])的数组 |
@days[3,4,5] | 包含($days[3],$days[4],$days[5])数组片段的数组 |
@days[3..5] | 包含($days[3],$days[4],$days[5])数组片段的数组 |
@days{'Jan','Feb'} | 包含($days{'Jan'},$days{'Feb'})片段的散列 |
散列:
构造 | 含义 |
%days | (Jan=>31,Feb=>$leap?29:28,...) |
2. 数组和散列
数组:
@home = ("couch", "chair", "table", "stove");
$home[0] = "couch";
数组是有序的,所以可以pop和push
散列:
%longday = ("Sun", "Sunday", "Mon", "Monday", "Tue", "Tuesday", "Wed", "Wednesday", "Thu", "Thursday", "Fri", "Friday", "Sat", "Saturday"); %longday = ( "Sun" => "Sunday", "Mon" => "Monday", "Tue" => "Tuesday", "Wed" => "Wednesday", "Thu" => "Thursday", "Fri" => "Friday", "Sat" => "Saturday", ); $longday{"Wed"} $wife{"Jacob"} = ("Leah", "Rachel", 'Bilhah", "Zilpah"); # 错 $wife{"Jacob"} = ["Leah", "Rachel", "Bilhah", "Zilpah"]; # 正确 []把列表转换成标量,然后把标量的引用赋给$wife{"Jacob"} 3. 字符串操作符: . X 4. 最左边的值被当成表达式的值返回 $a = $b = $c =0; ($temp -= 32) *= 5/9 chop ($number = <STDIN>); 5.V-字串文本 6.环境 标量和列表环境: @x = funkshun(); # list context @x[1] = funkshun(); # list context @x{"ray"} = funkshun(); # list context %x = funkshun(); # list context 7.列表值和数组 (list) (LIST)[LIST] ($a, $b, $c) = (1, 2, 3); ($map{red}, ${map{green}, $map{blue}) = (0xff0000, 0x00ff00, 0x0000ff); ($a, $b, @rest) = split; my ($a, $b, %rest) = @arg_list; 在标量环境里的列表赋值返回赋值表达式右边生成的元素的个数: $x = (($a,$b)=(7,7,7)); # 把 $x 设为 3,不是 2 $x = ( ($a, $b) = funk()); # 把 $x 设为 funk() 的返回数 $x = ( () = funk() ); # 同样把$x 设为 funk() 的返回数 数组长度 @day; @day+1;@whatever = (); $#whatever = -1; scalar(@whatever) == $#whatever + 1; 截断一个数组并不回收其内存。你必须 undef(@whatever) 来把它的内存释放回你的进程的内存池里。 8.散列 %map = ('red', 0xff0000,'green', 0x00ff00,'blue',0x0000ff); %map = (); # 先清除散列 $map{red} = 0xfff0000; $map{green} = 0x00ff00; $map{blue} = 0x0000ff; %map = ( red => 0xff0000, green => 0x00ff00, blue => 0x0000ff, ); $rec = { NAME => 'John Simth', RANK => 'Captain', SERNO => '951413', }; $fiels = radio_group( NAME => 'animals' VALUES =>['camel','llama','ram','wolf'], DEFAULT =>'camel', LINEBREAD => 'true', LABELS =>\%animal_names, ); 散列是无序的。散列在标量环境里面返回一个用斜线分隔的已用空间和分配的总空间的值组成的字串或false. scalar(keys(%HASH)) 仿真数组,一个包含k,一个包含v: $people{ $state, $country } = $census_results; $people{ join $; =>$state, $county} = $census_results; 9.类型团 *代表所有类型 应用一:传递或者存储文件句柄 保存:$fh = *STDOUT; 引用:$fh = \*STDOUT; 创建文件句柄的一个方法: sub newopen { my $path = shift; local *FH; # 不是my() 或 our () open(FH,$path ) or return undef; return *FH: # 不是\*FH! } $fh = newopen('/etc/passwd'); 应用二:把一个符号表取另一个符号表名字做别名 全部:*foo = *bar; 部分:*foo = \$bar; 10.输入操作符 反钩号操作符:` $info = `finger $user`; 尖括号操作符:<> 文件名聚集操作符: @files = <*.xml>; @files = glob("*.xml");
Perl 的操作符有三种元数:单目,双目和三目。
结合性 | 元数 | 优先级表 |
无 | 0 | 项,和列表操作符(左侧) |
左 | 2 | -> |
无 | 1 | ++ -- |
右 | 2 | ** |
---|---|---|
右 | 1 | !~>和单目 + 和 - |
左 | 2 | =~ !~ |
左 | 2 | * / % x |
左 | 2 | + - . |
左 | 2 | << > > |
右 | 0,1 | 命名单目操作符 |
无 | 2 | < > <= >= lt gt le ge |
无 | 2 | = <=> eq ne cmp |
左 | 2 | & |
左 | 2 | | …… |
左 | 2 | && |
左 | 2 | || |
无 | 2 | .. ... |
右 | 3 | ?: |
右 | 2 | + += -+ *= 等等 |
左 | 2 | , => |
右 | 0+ | 列表操作符(右侧) |
右 | 1 | not |
左 | 2 | and |
左 | 2 | or xor |
只处理标量值。
1.项和列表操作符(左向)
最容易出错的地方是你用圆括弧把数学参数组合起来的时候,但是你却忘记了圆括弧同时用于组合函数参数:
print ($foo & 255) + 1, "\n"; # 打印($foo & 255) 同样当作项分析的构造还有 do {} 和 eval {} 以及子过程和方法调用,匿名数组和散列构造符 [] 和 {},还有匿名子过程构造符 {}。
2.箭头操作符
3.自增和自减操作符
自增操作符有一点额外的内建处理。如果你增加的变量是一个数字,或者该变量在一个数字环境里使用,你得到正常自增的功能。不过,如果该变量从来都是在字串环境里使用,而且值为非空,还匹配模式/^[a-zA-z]*[0-9]*$/,这时自增是以字串方式进行的,每个字符都保留在其范围之内,同时还会进位:
4.指数运算
5.表意单目操作符
! ~ +
单目操作符 \ 给它后面的东西创建一个引用。
6.绑定操作符
if( ($k, $v) = $string =~ m/(\w+)=(\w*)/) {
print "KEY $k VALUE $v\n";
}
7.乘号操作符
8.附加操作符
Perl 还有惯用的 +(加法)和 -(减法)操作符。两种操作符都在必要的时候把它们的参数从字串转换为数字值并且返回一个数字值。
9.移位操作符
10.命名单目操作符和文件测试操作符
表 3-2 命名单目操作符
-X (file tests) | gethostbyname | localtime | return |
alarm | getnetbyname | lock | rmdir |
caller | getpgrp | log | scalar |
chdir | getprotobyname | lstat | sin |
chroot | glob | my | sleep |
cos | gmtime | oct | sqrt |
defined | goto | ord | srand |
delete | hex | quotemeta | stat |
do | int | rand | uc |
eval | lc | readlink | ucfirst |
exists | lcfirst | ref | umask |
exit | length | require | undef |
表3-3 模糊字符
字符 | 操作符 | 项 |
+ | 加法 | 单目正号 |
- | 减法 | 单目负号 |
* | 乘法 | *类型团 |
/ | 除法 | /模式/ |
< | 小于号,左移 | ,<<END |
. | 连接 | .3333 |
? | ?: | ?模式? |
% | 模除 | %assoc |
& | &, && | &subroutine(子过程) |
表3-4 文件测试操作符
操作符 | 含义 |
-r | 文件可以被有效的UID/GID读取。 |
-w | 文件可以被有效的UID/GID写入。 |
-x | 文件可以被有效的UID/GID执行。 |
-o | 文件被有效UID所有 |
-R | 文件可以被真实的UID/GID读取。 |
-W | 文件可以被真实的UID/GID写入。 |
-X | 文件可以被真实的UID/GID执行。 |
-O | 文件被真实的UID所有 |
-e | 文件存在 |
-z | 文件大小为零 |
-s | 文件大小不为零(返回大小) |
-f | 文件是简单文件 |
-d | 文件是目录 |
-l | 文件是符号连接 |
-p | 文件是命名管道(FIFO)。 |
-S | 文件是套接字 |
-b | 文件是特殊块文件 |
-c | 文件是特殊字符文件 |
-t | 文件句柄为一个tty打开了 |
-u | 文件设置了setuid位 |
-g | 文件设置了setgid位 |
-k | 文件设置了sticky位 |
-T | 文件是文本文件 |
-B | 文件是一个二进制文件(与-T对应) |
-M | 自从修改以来的文件以天记的年龄(从开始起) |
-A | 自从上次访问以来的文件以天记的年龄(从开始起) |
-C | 自从inode修改以来的文件以天记的年龄(从开始起) |
如果给任何文件测试(操作符)(或者是 stat 或 lstat 操作符)的特殊文件句柄只包含单独一个下划线,则使用前一个文件测试的 stat 结构,这样就省了一次系统调用。(对 -t 无效,而且你还要记住 lstat 和 -l 会在 stat 结构里保存符号连接而不是真实文件的数值。类似地,在一个正常的 stat 的后面的 -l _ 总是会为假。)
print "Can do.\n" if -r $a || -w _ || -x _;
11.关系操作符
关系操作符不能结合,这就意味着 $a < $b < $c 是语法错误。
和一些计算机语言不同的是,在比较中,尾部的空白也计入比较中。
12.相等操作符
表3-6 相等操作符
数字 | 字串 | 含义 |
== | eq | 等于 |
= | ne | 不等于 |
<=> | cmp | 比较,带符号结果 |
13.位操作符
如果两个操作数都是数字(或者被当作数字使用),那么两个操作数都被转换成整数然后在两个整数之间进行位操作。
如果两个操作数都是字串(而且自从它们被设置以来还没有当作数字使用过),那么该操作符用两个字串里面来的位做位操作。这种情况下,没有任何字长限制,因为字串本身没有尺寸限制。
14.C 风格的逻辑(短路)操作符
15.范围操作符
..
...
16.条件操作符
17.赋值操作符
18.逗号操作符
标量用法和类表用法
19.列表操作符(右向)
20.逻辑与,或,非和异或
21.Perl 里没有的 C 操作符(指针)
单目 & 取址操作符。不过,Perl 的 \ 操作符(用于使用引用)填补了这个生态空白:
$ref_to_var = \$var;
单目 * 解取址操作符。perl没有地址,也就没有取地址值得需要。
match() -> m//
s///
十二个元字符:\ | ( ) [ { ^ $ * + ? .
1.模式匹配操作符
/$var$/ 先变量替换
m// s/// tr/// =~ !~
$` $& $' $1 $2
2.修饰词
修饰词 | 含义 |
---|---|
/i | 忽略字母的大小写(大小写无关) |
/s | 令 . 匹配换行符并且忽略不建议使用的 $* 变量 |
/m | 令 ^ 和 $ 匹配下一个嵌入的 \n。 |
/x | 忽略(大多数)空白并且允许模式中的注释 |
/o | 只编译模式一次 |
3.m//
修饰词 | 含义 |
---|---|
/i | 或略字母大小写 |
/m | 令 ^ 和 $ 匹配随后嵌入的 \n。 |
/s | 令 . 匹配换行符并且忽略废弃了的 $*。 |
/x | 或略(大多数)空白并且允许在模式里的注释 |
/o | 只编译模式一次 |
/g | 全局地查找所有匹配 |
/cg | 在 /g 匹配失败后允许继续查找 |
m??匹配最后一个
4.s///
修饰词 | 含义 |
---|---|
/i | 或略字母大小写 |
/m | 令 ^ 和 $ 匹配随后嵌入的 \n。 |
/s | 令 . 匹配换行符并且忽略废弃了的 $*。 |
/x | 或略(大多数)空白并且允许在模式里的注释 |
/o | 只编译模式一次 |
/g | 全局地查找所有匹配 |
/e | 把右边当作一个表达式计算 |
($lotr = $hobbit ) =~ s/Bilbo/Frodo/g;
for (@chapters) { s/Bilbo/Frodo/g } # 一章一章的替换
s/bilbo/Frodo/g for @chapters; # 一样的东西
for (@newhues = @oldhues) { s/blue/red/}
for( $newshow = $oldshow ) {
s/Fred/Homer/g;
s/Wilma/Marge/g;
s/Pebbles/Lisa/g;
s/Dino/Bart/g;
}
while s/\b(\w+) \1\b/$1/gi;
while s/\([^()]*\)//g;
5. 元字符表
符号 | 原子性 | 含义 |
---|---|---|
\... | 变化 | 反逃逸下一个非字母数字字符,转意下一个字母数字(可能) |
...|... | 否 | 可选(匹配前者或者后者)。 |
(...) | 是 | 分组(当作单元对待)。 |
[...] | 是 | 字符表(匹配一个集合中的一个字符)。 |
否 | 如果在字串开头则为真(或者可能是在任何换行符后面。) | |
. | 是 | 匹配一个字符(通常除了换行符以外)。 |
$ | 否 | 在字串尾部时为真(或者可能是在任何换行符前面)。 |
正则量词
量词 | 原子性 | 含义 |
---|---|---|
* | 否 | 匹配 0 或者更多次数(最大)。 |
+ | 否 | 匹配 或者更多次数(最大)。 |
? | 否 | 匹配 1 或者0次(最大)。 |
{COUNT} | 否 | 匹配COUNT 次 |
{MIN,} | 否 | 匹配至少MIN次(最大)。 |
{MIN,MAX} | 否 | 匹配至少MIN次但不超过MAX次(最大) |
*? | 否 | 匹配0或者更多次(最小) |
+? | 否 | 匹配1或者更多次(最小) |
?? | 否 | 匹配0或者1次(最小) |
{MIN,}? | 否 | 匹配最多MIN次(最小) |
{MIN,MAX}? | 否 | 匹配至少MIN次但不超过MAX次(最小) |
扩展的正则序列
扩展 | 原子性 | 含义 | |
---|---|---|---|
(?#...) | 否 | 注释,抛弃 | |
(?:...) | 是 | 只集群,不捕获的圆括弧 | |
(?imsx-imsx) | 否 | 打开/关闭模式修饰词 | |
(?imsx-imsx:...) | 是 | 集群圆括弧加修饰词 | |
(?=...) | 否 | 如果前向查找断言成功,返回真 | |
(?!...) | 否 | 如果前向查找断言失败,返回真 | |
(?<=...) </td> | 否 | 如果前向查找断言成功,返回真 | |
(? | 否 | 如果前向查找断言失败,返回真 | |
(?>...) | 是 | 匹配未反向跟踪的子模式 | |
(?{...}) | 否 | 执行嵌入的Perl代码 | |
(??{...}) | 是 | 匹配来自嵌入Perl代码。 | |
(?(...)... | ...) | 是 | 匹配if-then-elase模式 |
(?(...)...) | 是 | 匹配if-then模式 |
字母数字正则元符号
符号 | 原子性 | 含义 |
---|---|---|
\0 | 是 | 匹配空字符(ASCII NUL)。 |
\NNN | 是 | 匹配给出八进制的字符,最大值为\377。 |
\n | 是 | 匹配前面第n个捕获字串(十进制)。 |
\a | 是 | 匹配警钟字符(BEL)。 |
\A | 否 | 如果在字串的开头为真 |
\b | 是 | 匹配退各字符(BS)。 |
\b | 否 | 在字边界为真 |
\B | 否 | 不在字边界时为真 |
\cX | 是 | 匹配控制字符 Control-x(\cZ,\c[,等)。 |
\C | 是 | 匹配一个字节(C字符),甚至在utf8中也如此(危险) |
\d | 是 | 匹配任何数字字符 |
\D | 是 | 匹配任何非数字字符 |
\e | 是 | 匹配逃逸字符(ASCII ESC,不是反斜杠)。 |
\E | —— | 结束大小写(\L,\U)或者掩码(\Q)转换 |
\f | 是 | 匹配进页字符(FF)。 |
\G | 否 | 如果在前一个m//g的匹配结尾位置时为真 |
\l | —— | 只把下一个字符变成小写 |
\L | —— | 把\E以前的字母都变成小写 |
\n | 是 | 匹配换行符字符(通常是NL,但是在Mac上是CR)。 |
\N{NAME} | 是 | 匹配命名字符(\N{greek:Sigma})。 |
\p{PROP} | 是 | 匹配任何有命名属性的字符 |
\P{PROP} | 是 | 匹配任何没有命名属性的字符 |
\Q | —— | 引起(消元)直到\E前面的字符 |
\r | 是 | 匹配返回字符(通常是CR,但是在Mac上是NL)。 |
\s | 是 | 匹配任何空白字符。 |
\S | 是 | 匹配任何非空白字符。 |
\t | 是 | 匹配水平制表符(HT)。 |
\u | —— | 只把下一个字符变成标题首字符 |
\U | —— | 大写(不是标题首字符)\E 以前的字符。 |
\w | 是 | 匹配任何“字”字符(字母数字加"_" )。 |
\W | 是 | 匹配任何“非字”字符。 |
\x{abcd} | 是 | 匹配在十六进制中给出的字符。 |
\X | 是 | 匹配Unicode里的”组合字符序列“字串。 |
\z | 否 | 只有在字串结尾时为真 |
\Z | 否 | 在字串结尾或者在可选的换行符之前为真。 |
6.特定的字符
逃逸 | 含义 |
---|---|
\0 | 空字符(ASCII NUL) |
\a | 警铃(BEL) |
\e | 逃逸(ESC) |
\f | 进纸(FF) |
\n | 换行符 (NL,Mac里的CR) |
\r | 回车(CR,Mac里的NL) |
\t | 水平制表符(HT) |
\cx
\NNN
\x{LONGHEX}
\N{NAME}
7.典型字符表
符号 | 含义 | 做字节 | 做 utf8 |
---|---|---|---|
\d | 数字 | [0-9] | \p{IsDigit} |
\D | 非数字 | [^0-9} | \P{IsDigit} |
\s | 空白 | [ \t\n\r\f] | \p{IsSpace} |
\S | 非空白 | [^ \t\n\r\f] | \P{IsSpace} |
\w | 字 | [a-zA-Z0-9_] | \p{IsWord} |
\W | 非字 | [^a-zA-Z0-9_] | \P{IsWord} |
8.Unicode