Могу ли я использовать именованные группы в регулярном выражении Perl для получения результатов в хэше? - PullRequest
19 голосов
/ 14 ноября 2008

Возможно ли выполнить сопоставление именованной группы в синтаксисе регулярных выражений 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 подобным образом?

Ответы [ 4 ]

38 голосов
/ 14 ноября 2008

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

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

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

19 голосов
/ 14 ноября 2008

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

10 голосов
/ 07 июля 2009

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

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

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

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

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

4 голосов
/ 14 ноября 2008

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

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

Вы можете найти информацию здесь .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...