【问题标题】:Perl last pattern patch variablePerl 最后一个模式补丁变量
【发布时间】:2014-03-17 17:33:30
【问题描述】:

我对 perl 比较陌生,最近学习了一些脚本并偶然发现了这个正则表达式

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

听起来很有趣,但我不明白它的实际作用,谁能帮我理解它的用法,

我还发现了一些例子,如下所示,

$<digit>正则表达式括号捕获持有者。”

【问题讨论】:

  • 不确定,但$+ 可能是组号。在这种情况下 if ($+ == 2) { then 匹配 refision }。我可能错了。不过,这听起来像是命名的捕获组哈希。即 $+{name}。

标签: regex perl scripting


【解决方案1】:

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

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

这些从左到右枚举为$1$2,...。有时,我们可能想要访问最后一次成功的捕获。例如:

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

所以我们要么需要$1,要么需要$2,它们不会同时被填满。我们可以这样做:

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

它使用// 定义或运算符。或者我们可以使用$+ 来引用最近成功捕获的任何内容。您可以将其视为$-1:最后一个捕获组(除了它不是源代码中的最后一个,而是最新的时间)。

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

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

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

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

【讨论】:

  • 命名捕获是我认为我正在查看的,我们有几行看起来相似的代码,$item =~ /(?.*)\.tst/; // 看起来像捕获了在 中比较的内容 if($c_attr_val eq $+{itemName}) { 并且我在这里使用了最后一个匹配项进行比较。希望有道理
【解决方案2】:

$&lt;digit&gt; 保存捕获缓冲区信息。

正则表达式 -

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

代码 -

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-04-03
    • 2021-09-19
    • 1970-01-01
    • 1970-01-01
    • 2016-08-11
    • 2012-05-10
    相关资源
    最近更新 更多