我可以在Perl正则中使用命名组得到哈希结果吗?
在Perl的正则表达式语法中,能像Python那样进行命名分组匹配吗?我通常在匹配后把$n
的值绑定到合适的名称上,所以如果能在正则表达式中直接做到这一点,我会觉得更方便。
Python是这样做的:
>>> import re
>>> regex = re.compile(r'(?P<count>\d+)')
>>> match = regex.match('42')
>>> print match.groupdict()
{'count': '42'}
我知道?P
表示这是Python特有的正则表达式功能,但我希望在Perl中也有类似的功能,或者后来添加了这个功能。有没有办法在Perl中以类似的方式得到一个结果哈希?
5 个回答
13
有几个人提到,Perl 5.10 版本引入了命名分组的功能。
不过在之前的 Perl 版本中,你也可以做一些事情,虽然不太方便,但也算不错:
my %hash;
@hash{"count", "something_else"} = $string =~ /(\d+)\s*,\s*(\S+)/;
然后你可以使用:
$hash{"count"} 和 $hash{"something_else"}。
21
从Perl 5.10开始,Perl的正则表达式支持了一些Python的特性,这让它们变得和Python的正则表达式兼容。我想说,这些Python版本的正则表达式里有个"P"字母,但在Perl 5.10中,这些特性都可以使用。想了解更多细节,可以查看perlre的文档:
定义一个命名的捕获缓冲区。相当于 (?<NAME>pattern)
。
(?P<NAME>pattern)
引用一个命名的捕获缓冲区。相当于 \g{NAME}
。
(?P=NAME)
调用一个命名的捕获缓冲区。相当于 (?&NAME)
。
(?P>NAME)
虽然我没有在最新版本的《学习Perl》中加入Python兼容性,但我们确实涵盖了Perl 5.10的新特性,包括命名捕获。
51
在Perl语言中,可以用(?<NAME>pattern)
来给匹配的内容起个名字。这样你就可以通过%+
这个哈希表来获取这些命名的匹配结果。
$variable =~ /(?<count>\d+)/;
print "Count is $+{count}";
不过,这个功能只在Perl 5.10及以上版本中支持。