我是perl的相对新手,并且根据我最近的学习,我最终得到了一些脚本并偶然发现了这个正则表达式
$ +说
最后一个括号与最后一个搜索模式匹配。如果您不知道哪一组替代模式匹配,这将非常有用。例如:
/Version: (.*)|Revision: (.*)/
&& ($rev = $+)
;
听起来很有趣,但我无法理解它究竟是做什么的,有人可以帮我理解它的用法,
我还找到了一些如下所示的例子,
“$<digit>
Regexp括号内的捕获持有者。”
答案 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;
}
}