[b][size=large][align=center]perl-捕获变量[/align][/size][/b]
[b]1.捕获变量[/b]
捕获的功能指的是:把圆括号中模式所匹配的部分字符串暂时记忆下来的能力。如果有一对以上的圆括号。就会有一次以上的捕获。每个被捕获的对象是原本的字符串,而不是模式。
因为捕获标量存储的都是字符串,所以他们都是标量变量。 在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>"
[b]2.不捕获模式[/b]
面前所见的圆括号都会捕获部分的匹配串到捕获量($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"。
[b]3.命名捕获[/b]
虽然可以用括号的捕获能力并在$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可以自行命名。
输出:
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
[b]1.捕获变量[/b]
捕获的功能指的是:把圆括号中模式所匹配的部分字符串暂时记忆下来的能力。如果有一对以上的圆括号。就会有一次以上的捕获。每个被捕获的对象是原本的字符串,而不是模式。
因为捕获标量存储的都是字符串,所以他们都是标量变量。 在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>"
[b]2.不捕获模式[/b]
面前所见的圆括号都会捕获部分的匹配串到捕获量($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"。
[b]3.命名捕获[/b]
虽然可以用括号的捕获能力并在$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