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

В декларативных парадигмах инстанцирование невозможно (если вы не используете datafact или что-то подобное), поэтому способ решить вашу проблему - объявить, что пустой список имеет размер 0:

list([],0) :- !.
list([A|B], X1) :- list(B, X0), X1 = X0 + 1.

Таким образом, вы знаете, что длина списка L равна 1+ (длина хвоста L )

19
задан brian d foy 14 November 2008 в 03:09
поделиться

4 ответа

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

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

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

40
ответ дан 30 November 2019 в 01:59
поделиться

С Perl 5.10 Perl regexes поддерживает некоторые функции Python , делая их Python совместимый regexes, я предполагаю. Версии Python имеют "P" в них, но все они работают в Perl 5.10. Посмотрите документация perlre для деталей:

Определяют именованный накопительный буфер. Эквивалентный (?<NAME>pattern).

(?P<NAME>pattern)

Обратная ссылка на именованный накопительный буфер. Эквивалентный \g{NAME}.

(?P=NAME)

Вызов подпрограммы к именованному накопительному буферу. Эквивалентный (?&NAME).

(?P>NAME)

, Хотя я не добавил совместимость Python к последнему выпуску Изучение Perl, мы действительно покрываем новые функции Perl 5.10, включая именованные получения.

19
ответ дан 30 November 2019 в 01:59
поделиться

АФИК PCRE назвал группу, получающую как:

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

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

4
ответ дан 30 November 2019 в 01:59
поделиться

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

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

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

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

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

11
ответ дан 30 November 2019 в 01:59
поделиться