2015-07-21 8 views
8

Jak przewinąć początek następnej pozycji wyszukiwania o 1? Załóżmy na przykład, że chcę dopasować wszystkie cyfry między #. Poniższe da mi tylko numery nieparzyste.Jak cofnąć pozycję początkową następnego wyszukiwania o 1?

my $data="#1#2#3#4#"; 

while ($data =~ /#(\d)#/g) { 
    print $1, "\n"; 
} 

Ale jeśli mógłbym przewinąć początek następnej pozycji o 1, otrzymywałbym zarówno liczby parzyste, jak i nieparzyste.

To nie działa: pos() = pos() - 1;

wiem, że mogę to osiągnąć stosując split. Ale to nie odpowiada na moje pytanie.

for (split /#/, $data) { 
    print $_, "\n"; 
} 
+0

'/ C' prostu usuwane. –

Odpowiedz

8

Dzwonisz pos() na $_, zamiast $data

Od perldoc

Zwraca offset, gdzie ostatnia m // g szukaj w lewo off dla danej zmiennej ($ _ jest używane, gdy zmienna nie jest określona)

Więc

pos($data) = pos($data) - 1; 
+0

'pos ($ data) -;' – ikegami

11

Jednym ze sposobów jest użycie look-ahead assertion:

while ($data =~ /#(\d)(?=#)/g) { 
    print $1, "\n"; 
} 

znaki z twierdzeniem wygląd wyprzedzeniem nie są częścią dopasowane wypowiedzi i nie aktualizować pos() obok \d część wyrażenia regularnego .

Więcej dema:

say "#1#2#3#4#" =~ /#(\d)/g;   # 1234 
say "#1#2#3#4" =~ /#(\d)/g;   # 1234 
say "#1#2#3#4#" =~ /#(\d)(?=#)/g;  # 1234 
say "#1#2#3#4" =~ /#(\d)(?=#)/g;  # 123 
+5

Chociaż nie odpowiada na postawione pytanie, jest lepszym rozwiązaniem dla tego, co OP robi. – cjm

+1

Jestem ciągle zaskoczony, że ludzie mogą przeczytać ten bełkot. Ta najwyższa pętla - nie jest to wskazówka WTF. –

+0

Na szczęście jesteś we właściwym miejscu, ponieważ użytkownicy SO mogą udzielić odpowiedzi na wszelkiego rodzaju pytania dotyczące programowania. –

Powiązane problemy