Могу ли я использовать именованные группы в регулярном выражении Perl для получения результатов в хеше?

Можно ли выполнить сопоставление именованной группы в синтаксисе regex 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?

Ответ 1

Perl использует (?<NAME>pattern) для определения захватов имен. Вы должны использовать хэш %+ для их получения.

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

Это поддерживается только на Perl 5.10 и выше.

Ответ 2

Начиная с 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, в том числе названных захватов.

Ответ 3

Как сказал несколько человек, perl 5.10 назвал группы.

Но в предыдущих perls вы можете сделать что-то, а не как удобно, но относительно приятно:

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

а затем вы можете использовать:

$hash { "count" } и $hash { "something_else" }.

Ответ 4

AFIK PCRE назвал группу захватом как:

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

Информацию здесь.