Как я могу получить доступ к буферам захвата в скобках с квантификаторами? - PullRequest
2 голосов
/ 08 июля 2011

Как я могу получить доступ к буферам захвата в скобках с квантификаторами?

#!/usr/local/bin/perl
use warnings;
use 5.014;

my $string = '12 34 56 78 90';

say $string =~ s/(?:(\S+)\s){2}/$1,$2,/r;
# Use of uninitialized value $2 in concatenation (.) or string at ./so.pl line 7.                                                           
# 34,,56 78 90 

С @LAST_MATCH_START и @LAST_MATCH_END это работает *, но строка становится слишком длинной.Не работает, посмотрите на ответ TLP.

*The proof of the pudding is in the eating не всегда прав.

say $string =~ s/(?:(\S+)\s){2}/substr( $string, $-[0], length($-[0]-$+[0]) ) . ',' . substr( $string, $-[1], length($-[1]-$+[1]) ) . ','/re;
# 12,34,56 78 90

Ответы [ 2 ]

4 голосов
/ 08 июля 2011

Вы не можете получить доступ ко всем предыдущим значениям первой группы захвата, только последнее значение (или текущее значение в конце матча, как вы его видите) будет сохранено в $1 (если вы не хотите использовать (?{ code }) взломать).

Для вашего примера вы можете использовать что-то вроде:

s/(\S+)\s+(\S+)\s+/$1,$2,/
1 голос
/ 08 июля 2011

В утверждении, которое вы говорите "работает", есть ошибка.

length($-[0]-$+[0]) 

Всегда будет возвращать длину отрицательной длины вашего регулярного выражения. Числа $-[0] и $+[0] являются смещением начала и конца первого совпадения в строке соответственно. Поскольку длина совпадения составляет три символа (в данном случае), начальное и конечное смещение всегда будут -3, а length(-3) всегда будет 2.

Итак, вы берете первые два символа матча 12 34 и первые два символа матча 34 и соединяете их запятой в середине. Это работает по стечению обстоятельств, а не по группам захвата.

Звучит так, будто вы просите нас решить проблемы, которые у вас возникают с вашим решением, а не спрашивать нас об основной проблеме.

...