我可以在Perl正则中使用命名组得到哈希结果吗?

27 投票
5 回答
14904 浏览
提问于 2025-04-11 19:02

在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及以上版本中支持。

撰写回答