设为首页 收藏本站
查看: 1137|回复: 0

[经验分享] perl-捕获变量

[复制链接]

尚未签到

发表于 2017-5-17 07:08:10 | 显示全部楼层 |阅读模式
perl-捕获变量

1.捕获变量
捕获的功能指的是:把圆括号中模式所匹配的部分字符串暂时记忆下来的能力。如果有一对以上的圆括号。就会有一次以上的捕获。每个被捕获的对象是原本的字符串,而不是模式。
因为捕获标量存储的都是字符串,所以他们都是标量变量。 在Perl中,被捕获的字符串被存储在$1,$2,$3....中。
Perl 的正则表达式中如果出现 () ,则发生匹配或替换后 () 内的模式被 Perl 解释器自动依次赋给系统 $1, $2 ......
请看下面的例子:
$string = "I love perl";
$string =~ s/(love)/<$1>/; # 此时 $1 = "love",并且该替换的结果是将 $string 变为 "I <love> perl"
$string = "i love perl";
$string =~ s/(i)(.*)(perl)/<$3>$2<$1>/; # 这里 $1 = "i",$2 = " love ",$3 = "perl",并且替换后 $string 变为 "<perl> love <i>"
2.不捕获模式
面前所见的圆括号都会捕获部分的匹配串到捕获量($1,$2,....),但是有时候却需要关闭这个功能,而仅仅是用来对他进行分组。
使用?:来跳过捕获
比如:
if (/(?:baronto)?saurus (steak|burger)/)
使用不捕获括号来跳过baronto。
注意最后一句的理解:$1 = "i",$2 = " love ",$3 = "perl",然后i 由 <$3>替换,(.*)由$2替换,love由<$1>替换。
替换操作 s/<pattern>/<replacement>/ 还可以在末尾加上 e 或 g 参数,他们的含义分别为:
s/<pattern>/<replacement>/g 表示把待处理字符串中所有符合 <pattern> 的模式全部替换为 <replacement> 字符串,而不是只替换第一个出现的模式。
s/<pattern>/<replacement>/e 表示将把 <replacemnet> 部分当作一个运算符,这个参数用的不多。
比如下面的例子:
$string = "i:love:perl";
$string =~ s/:/*/; #此时 $string="i*love:perl";
$string = "i:love:perl";
$string =~ s/:/*/g; #此时 $string="i*love*perl";
$string =~ tr/*/ /; #此时 $string="i love perl";
$string = "www22cgi44";
$string =~ s/(\d+)/$1*2/e; # (/d+)代表 $string 中的一个或多个数字字符,将这些数字字符执行 *2 的操作,因此最后 $string 变成了 "www44cgi88"。
3.命名捕获
虽然可以用括号的捕获能力并在$1、$2这样的变量中存储捕获的串,但是管理这样的数字变量也是比较困难。
比如:
my $names = 'Fred or Barney';
if ($names =~ /(\w+) (and|or) (\w+)/){
  print "I saw $1 and $2";
}
输出:I saw Fred and or
现在看到了第二个输出,但它却不是我们期望的输出,因为第二个括号的引入导致了问题,引入普通的括号导致“择一”模式匹配进入了$2,而我们所期望的串进入了$3.
现在不必记住这些$1数字的含义了,现在捕获的结果会进入哈希(%+),其中的键就是在捕获时候使用的特殊标签,其中捕获的值则是被捕获的串。
为捕获串加标签的方法是使用(?<LABEL>PATTERN)这样的写法,而LABEL可以自行命名。

my $what = 'fred|barney';
open (MYFILE,"Exercise9_1.txt") || die "Cannot open the file.";
print "The file has open.\n";
my @array = <MYFILE>;
foreach my $line (@array){
if ($line =~ /((?<word_1>$what)(?<word_2>$what)(?<word_3>$what))/){
print "The matching string is:$+{word_1}$+{word_2}$+{word_3}\n";
}else {
print "The line is : $line \n";
}
}
close MYFILE;


输出:
The matching string is:fredfredfred
The matching string is:fredbarneyfred
The matching string is:fredbarneybarney
The matching string is:barneybarneybarney
The matching string is:barneybarneybarney
The matching string is:fredbarneyfred
The matching string is:barneybarneybarney

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-378243-1-1.html 上篇帖子: perl 分号(;) 下篇帖子: notepad++ 运行perl
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表