标签:perl
正则表达式:
正则表达式在perl叫模式,是一个匹配某字符串的模板。
perl的正则表达式和shell/awk/sed/grep的差不多。
m/pattern/ 运算模式匹配:
/pattern/就是m/pattern/的简写,
定界符//可以换成别的符号([{<#$%等等,
如果用//开头的m可以省略,其他符号m不能省略。
定界符应该选择模式中不会出现的字符。
Perl中的正则表达式的修饰符:
/pattern/i 用i来匹配不用区分大小写。
/pattern/s 用s来匹配任意字符。
/pattern/x 用x来表示可以在模式中随意加上空白:
Pattern中的空白都回被忽略,可以用\s来匹配空白。
Perl中的注释也是空白。
if (m{
Pattern1 #comment1
Pattern2 #comment2
}six) {
…
}
Perl的反向引用:
\n 表示对哪个分组的引用,分组数为//中的左括号的位置。
/(.)\1/ 表示匹配连续出现的两个同样的字符,\1是对第一组的引用。
/x(...)y1\/ 表示x之后的三个字符在y之后再出现一次,也就是x...y...
/x(.)(.)\2\1/ 分别对第一组和第二组的引用,\2表示对第二个分组的引用。
/x((.)(.)\3\2)y\1/ 用到了三个分组。
新版perl可以使用反向引用:
\g{N} 用N表示哪个分组。
默认的匹配对象是$_。
“string” =~ /pattern/ #使用=~绑定操作符指定匹配的对象。
$res = <STDIN> =~/pattern/; #如果匹配到$res=1,否则为空
捕获变量:
$n 用来表示 /pattern/ 中从左到右第n个括号中的内容。
$n这些捕获变量只有在下次匹配成功时才会被重置。
(?:pattern)使用?:表示这个括号不捕获,只是分组,$n不计数。
if ($str =~ /pattern/) {
my $match = $1; #将捕获的字符串保存起来以便以后使用。
} else {
… #如果匹配失败,$n保存的还是上次的值。
}
新版perl可以使用命名捕捉:
加标签的方法 /(?<LABEL>PATTERN) /
捕捉的结果进入特殊哈希%+
键:标签 , 值:就是捕捉的字符串。
LABEL自己命名,访问的值为$+{LABEL}
新版的反向引用还可以用: \g{LABEL} 等效于 \k<LABEL>
自动匹配变量:
$& 用来存放/pattern/里实际匹配到的部分。
$` 用来存放匹配起始位置之前的字符串。
$‘ 保存了字符串中从来没有被匹配到的部分。
while (<>) {
chomp;
if (/YOUR_PATTERN_GOES_HERE/) {
print “Matched:|$`<$&>$‘|\n”;
} else {
print “No match: |$_|\n”;
}
}
s/pattern1/pattern2/ 运算替换操作:
s/pattern1/pattern2/; #用pattern2替换掉pattern1匹配到的内容。
s/// 替换成功返回真,否则返回假。
s操作的的定界符也可以是任意字符。
s#pattern1#pattern2#;
s{pattern1}{pattern2};
s[pattern1]<pattern2>;
s替换操作的修饰符:
s/pattern1/pattern2/g; #g表示全局替换。
s/^\s/+|\s+&//g; #去掉开头和结尾的空白。
i 表示不去分大小写
s 表示匹配任意字符。
m 可以匹配行内的换行符
s操作的默认字符串也是$_,还可以绑定操作符:
$filename =~ s#^.*/##s; #去掉路径获取文件名
大小写转换:
下面操作适用于双引号内的字符串。
s/pattern1/\Upattern2/; #将pattern2转换成大写。
s/pattern1/\Lpattern2/; #将pattern2转换成小写。
s/pattern1/\Upattern2\Epattern3/; #只将pattern2转换成大写。
s/pattern1/\Lpattern2\Epattern3/; #只将pattern2转换成小写。
s/pattern1/\upattern2/; #将pattern2的第一个字符大写。
s/pattern1/\lpattern2/; #将pattern2的第一个字符小写。
贪婪量词:
尽可能匹配更多
*
+
?
{n}
{n,}
{n,m}
非贪婪量词:
尽可能匹配更少
*?
+?
??
{n}?
{n,}?
{n,m}?
一次更新多个文件:
$^I 表示备份文件的扩展名。
在命令行进行编辑:
perl -p -i.bak -w -e ‘s/pattern1/pattern2/g‘ fred*.dat
将所有fred*.dat文件中的pattern1全部改成pattern2,备份文件为*.bak.
~~ 智能匹配:
use 5.010;
智能匹配优先级:
%a ~~ %b
%a ~~ @b
%a ~~ /Fred/
%a ~~ ‘Fred’
@a ~~ @b
@a ~~ /Fred/
@a ~~ 123
@a ~~ ‘Fred’
$name ~~ undef
$name ~~ /Fred/
123 ~~ ‘123.0’
‘Fred’ ~~ ‘Fred’
123 ~~ 456
自动在hash中匹配键:
say “I found a key matching‘Fred’.\n”
if %name ~~ /Fred/;
比较两个数组大小:
say “The array have the sameelements!\n”
if @arr1 ~~ @arr2;
判断结果是否在集合中:
say “Ths $result is one ofthe input values @nums!\n”
if @nums ~~ $result;
split /PATTERN/[, EXPR,LIMIT]]:
将模式作为分隔符拆分字符串到列表中,返回列表或列表长度,
split会保留开头的空白,忽略结尾的空白,
split默认用空白分割$_.
my@arr = split; # == split /\s+/, $_;
join EXPR, LIST:
将字符串expr作为分隔符插入到列表中组成一个新的字符串并返回。
pos
quotemeta
study
qr//
标签:perl
原文地址:http://blog.csdn.net/wowotouweizi/article/details/45224143