2015-07-21 3 views
8

Come posso riavvolgere l'inizio della prossima posizione di ricerca di 1? Ad esempio, supponiamo di voler abbinare tutte le cifre tra #. Quanto segue mi darà solo numeri dispari.Come riavvolgere la posizione di inizio della ricerca successiva di 1?

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

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

Ma se potessi riavvolgere l'inizio della posizione successiva di 1, otterrei sia numeri pari che dispari.

Questo non funziona: pos() = pos() - 1;

So che posso fare questo usando split. Ma questo non risponde alla mia domanda.

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

'/ C' appena rimosso. –

risposta

8

si sta chiamando pos() su $_, invece di $data

Da perldoc

restituisce l'offset dove l'ultima m // g Ricerca sulla sinistra disattivato per la variabile in questione ($ _ viene utilizzato quando la variabile non è specificata)

Quindi,

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

'pos ($ data) -;' – ikegami

11

Un approccio è quello di utilizzare un look-ahead assertion:

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

I caratteri nella affermazione look-ahead non fanno parte dell'espressione abbinata e non aggiorna pos() oltre la \d parte dell'espressione regolare .

Più demo:

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

Sebbene questo non risponda alla domanda come proposta, è una soluzione migliore a ciò che l'OP sta tentando di fare. – cjm

+1

Sono costantemente stupito dal fatto che le persone possano leggere questo linguaggio senza senso. Quel ciclo in alto, ma non un indizio WTF. –

+0

Fortunatamente sei nel posto giusto in quanto gli utenti di SO possono darti risposte a tutti i tipi di domande di programmazione. –

Problemi correlati