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