perl-捕获变量

http://weihe6666.iteye.com/blog/980293

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可以自行命名。 

Perl代码   收藏代码
  1. my $what = 'fred|barney';  
  2. open (MYFILE,"Exercise9_1.txt") || die "Cannot open the file.";  
  3. print "The file has open.\n";  
  4. my @array = <MYFILE>;  
  5. foreach my $line (@array){  
  6.     if ($line =~ /((?<word_1>$what)(?<word_2>$what)(?<word_3>$what))/){  
  7.         print "The matching string is:$+{word_1}$+{word_2}$+{word_3}\n";  
  8.     }else {  
  9.         print "The line is : $line \n";  
  10.     }  
  11. }  
  12. 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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值