Ответ 1
Perl использует (?<NAME>pattern)
для определения захватов имен. Вы должны использовать хэш %+
для их получения.
$variable =~ /(?<count>\d+)/;
print "Count is $+{count}";
Это поддерживается только на Perl 5.10 и выше.
Можно ли выполнить сопоставление именованной группы в синтаксисе 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?
Perl использует (?<NAME>pattern)
для определения захватов имен. Вы должны использовать хэш %+
для их получения.
$variable =~ /(?<count>\d+)/;
print "Count is $+{count}";
Это поддерживается только на Perl 5.10 и выше.
Начиная с 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, в том числе названных захватов.
Как сказал несколько человек, perl 5.10 назвал группы.
Но в предыдущих perls вы можете сделать что-то, а не как удобно, но относительно приятно:
my %hash;
@hash{"count", "something_else"} = $string =~ /(\d+)\s*,\s*(\S+)/;
а затем вы можете использовать:
$hash { "count" } и $hash { "something_else" }.
AFIK PCRE назвал группу захватом как:
(?'NAME'pattern)
(?<NAME>pattern)
Информацию здесь.