捕获变量

$_ = "Hello there neighbor";
if (/(\S+) (\S+), (\S+)/) {
    print "words were $1 $2 $3\n";
}

捕获变量的存续期

这些捕获变量通常能存活到下次成功匹配为止。也就是说,失败的匹配不会改动上次匹配时的捕获内容,而成功的匹配会将他们的值重置。

不捕获模式

在左括号后面加上问号和冒号(?:),告诉Perl这一对圆括号完全是为了分组而存在的。

if(/(?:bronto)?saurus (steak|burger)/){
    print "Fred wants a $1\n";
}

命名捕获

Perl 5.10 增加了对捕获内容直接命名的写法。 最终捕获到的内容会保存在特殊哈希
%+里面:其中键就是捕获时用的特殊标签,对应的值则是捕获的字符串
具体写法(?<LABEL>PATTERN),其中LABEL可以自行命名。

use 5.010;

my $names = 'Fred or Barney';
if ($names =~ m/(?<name1>\w+/) (?:and|or) (?<name2>\w+/){
    say "I saw $+{name1} and $+{name2}";
}

在使用捕获标签后,反向引用的写法也随之有所变化。 现在采用\g{label}这样的写法

use 5.010;
my $names = 'Fred Flintstone and Wilma Filintstone';

if ($name =~ m/(?<last_name>\w+)/ and \w+ \g{last_name} ){
    say "I saw $+{last_name}";
}

我们也以用另一种语法来表示反向引用。
\k<label> 等效于 \g{label}

posted @ 2013-09-16 10:36  新闻官  阅读(307)  评论(0编辑  收藏  举报