神奇的Perl-正则表达式(5)
声明:本神奇的Perl系列为刘兴(http://deepfuture.iteye.com/)原创,未经笔者授权,任何人和机构不能转载
1. 转化
1、语法格式:
$字符串变量名!~tr/<pattern>/<replacemnt>/
<pattern>为需要替换的匹配模式串,<replacement>为替换的字符串。 把符合 <pattern>模式的字符串转换为 <replacement>。
2、示例:
1) 将小写字母全部转成大写
#perl4-6.pl
my $zmb="abcde";
$zmb!~tr/[a-z]/[A-Z]/;#将小写转换成大写
print $zmb;
输出结果如下:
ABCDE
2) 简单加密数字。
#perl4-7.pl
#简单加密数字,0加密成e,1加密成f,2加密成g...以此类推
my $passnum=<stdin>;
$passnum!~tr/[0-9]/[e-n]/;#将数字转换成字母,实现简单加密
print "\n";
print $passnum;
运行后,我们随意输入一串数字:834235902
输出简单加密的信息:mhighjneg
声明:本神奇的Perl系列为刘兴(http://deepfuture.iteye.com/)原创,未经笔者授权,任何人和机构不能转载
1. 转化
1. 捕捉正则变量
我们使用模式串匹配字符串时,有时需要捕捉匹配到的字符串。
使用$数字的形式表示匹配到的正则变量,括号匹配顺序为匹配模式串从左至右。$1代表第1对括号匹配到的字串,$2代表第2对括号匹配到的字串,$3代表第3对括号匹配到的字串,以此类推。
2.1 使用数字反引用捕捉
use 5.010;
my $names='deep and future';
if ($names=~m/(\w+) (and|or) (\w+)/){
#2个(\w+)分别匹配and前和and后的字符串(不包括空格)
say "我获得了$1 and $3";
# future不被$2匹配,因为一个括号代表可捕捉位置,#$2模式串为and|or
}
输出: 我获得了 deep and future
再看一个更复杂的例子:
#perl4-8.pl
use 5.010;
my $names='Hello,Beijing';
if ($names=~m/(\w+)(,)(\w+)/){
#2个(\w+)分别匹配逗号前和逗号后的字符串(不包括空格),匹配位置分别为$1和$3
say "我获得了$1 and $3"; #$1为 Hello ,$3为 Beijing
}
#注意下面这次匹配,我们把逗号前的字符串和逗号放在一对括号内
if ($names=~m/((\w+)(,))(\w+)/){
#我们从左到右开始解读模式串((\w+)(,))(\w+)
#首先遇到一个左括号,我们找到它对应的右括号
#发现遇到的第一对括号内容为 ((\w+)(,))
# 接着寻找遇到的第二对括号 (\w+)
#然后是第三对括号 (,)
#最后是第四对括号 (\w+)
say "我获得了$2 and $4"; #$2为 Hello ,$4为 Beijing
}
输出结果如下:
我获得了Hello and Beijing
我获得了Hello and Beijing
使用$数字的形式表示匹配到的正则变量,括号匹配顺序为匹配模式串从左至右。$1代表第1对括号匹配到的字串,$2代表第2对括号匹配到的字串,$3代表第3对括号匹配到的字串,以此类推。