我可以在Perl正则表达式中使用命名组来获得散列结果吗?

zour9fqk  于 2022-11-15  发布在  Perl
关注(0)|答案(5)|浏览(125)

在Perl的正则表达式语法中,是否可以像Python的语法一样执行命名组匹配?我总是在匹配后将$n值绑定到适当的名称,所以如果可能的话,我会发现在正则表达式本身中执行此操作更方便。
Python是这样做的:

>>> import re
>>> regex = re.compile(r'(?P<count>\d+)')
>>> match = regex.match('42')
>>> print match.groupdict()
{'count': '42'}

我知道?P表明它是Python特有的regex特性,但我希望它在Perl中以不同的方式存在,或者是后来添加的。在Perl中有没有办法以类似的方式获得结果散列?

esyap4oy

esyap4oy1#

Perl使用(?<NAME>pattern)来指定名称捕获。您必须使用%+散列来检索它们。

$variable =~ /(?<count>\d+)/;
print "Count is $+{count}";

不过,只有Perl 5.10和更高版本才支持此功能。

rur96b6h

rur96b6h2#

从Perl 5.10开始,Perl正则表达式支持一些Python特性,我想这使它们与 Python 兼容。Python版本中有“P”,但所有这些都在Perl 5.10中工作。有关详细信息,请参见perlre文档:
定义已命名的捕获缓冲区。相当于(?<NAME>pattern)

(?P<NAME>pattern)

反向指涉具名撷取缓冲区。相当于\g{NAME}

(?P=NAME)

对已命名捕获缓冲区的子例程调用。等效于(?&NAME)

(?P>NAME)

尽管我没有将Python兼容性添加到最新版本的Learning Perl中,但我们确实介绍了Perl 5.10的新特性,包括命名捕获。

dbf7pr2w

dbf7pr2w3#

正如一些人所说,perl5.10已经命名了组。
但是在以前的perls中,你可以做一些事情,虽然不那么方便,但是相对来说很好:

my %hash;
@hash{"count", "something_else"} = $string =~ /(\d+)\s*,\s*(\S+)/;

然后您可以用途:
$hash{“计数”}和$hash{“其他内容”}。

tvz2xvvm

tvz2xvvm4#

AFIK PCRE将组捕获命名为:

(?'NAME'pattern)
(?<NAME>pattern)

你可以在这里找到信息。

gupuwyp2

gupuwyp25#

我使用%{^CAPTURE}哈希(为了可读性)。
这是English版本的%+,如上文Leon Timmermans所述。
例如,我为捕获PHP版本编写的代码:

#! /usr/bin/env perl

use v5.32;
use warnings;
use English;

my $output = `php -v`;

$output =~ m(PHP (?<version>\d.\d.\d\d)); # named capture group

say ${^CAPTURE}{version}; # instead of $1

在regex模式中,您可以将命名的捕获组引用为\g{NAME}
TIMTOWTDI,所以请使用最适合您的版本。

相关问题