Perl最后一个模式补丁变量

时间:2014-03-17 17:33:30

标签: regex perl scripting

我是perl的相对新手,并且根据我最近的学习,我最终得到了一些脚本并偶然发现了这个正则表达式

$ +说 最后一个括号与最后一个搜索模式匹配。如果您不知道哪一组替代模式匹配,这将非常有用。例如:     /Version: (.*)|Revision: (.*)/&& ($rev = $+);

听起来很有趣,但我无法理解它究竟是做什么的,有人可以帮我理解它的用法,

我还找到了一些如下所示的例子,

$<digit> Regexp括号内的捕获持有者。”

2 个答案:

答案 0 :(得分:3)

正则表达式可以有捕获组,在成功匹配后,它包含该模式部分的匹配子字符串:

/Version: (.*)|Revision: (.*)/
#         $1             $2

这些从左到右枚举为$1$2,....有时,我们可能想要访问上次成功捕获。 E.g:

"Version: v123"  → "v123"
"Revision: v678" → "v678"

因此,我们需要$1$2,它们不会同时填充。我们可以这样做:

/Version: (.*)|Revision: (.*)/ and $rev = ($1 // $2)

使用// defined-or运算符。或者我们可以使用$+来引用最近成功的捕获。您可以将其想象为$-1:最后一个捕获组(除了它不是源代码中的最后一个,但是最新的捕获组)。

在这个简单的例子中,使用$+可能有意义,但我从未真正使用它。更好的解决方法包括:

  • 使用可通过%+哈希访问的命名捕获:

    /Version: (?<rev>.*)|Revision: (?<rev>.*)/ and $rev = $+{rev}
    
  • 使用(?| ... | ... )构造重置编号。这会从左到右打破捕获组的正常编号,而是单独为每个替代编号编号:

    /(?|Version: (.*)|Revision: (.*))/ and $rev = $1
    #            $1             $1
    

答案 1 :(得分:1)

$<digit>保存捕获缓冲区信息。

正则表达式 -

   Version:\ 
   ( .* )            # (1)
|  
   Revision:\ 
   ( .* )            # (2)

代码 -

if ( $str =~ /Version: (.*)|Revision: (.*)/ )
{
    if ( defined $1 ) {
        $ver = $1;
    }
    elsif ( defined $2 ) {
        $rev = $2;
    }
}