Quando è utile l’applicazione \ G in una regex?

Non sono chiaro sull’uso / necessità dell’operatore \G
Ho letto nel perldoc :

Usa l’ancora \ G per iniziare la prossima partita sulla stessa corda in cui è stata interrotta l’ultima partita.

Non capisco davvero questa affermazione. Quando usiamo \g solito ci spostiamo comunque sul personaggio dopo l’ultima partita.
Come mostra l’esempio:

 $_ = "1122a44"; my @pairs = m/(\d\d)/g; # qw( 11 22 44 ) 

Quindi dice:

Se si utilizza l’ancora \ G, si forza la corrispondenza dopo 22 per iniziare con a:

 $_ = "1122a44"; my @pairs = m/\G(\d\d)/g; 

L’espressione regolare non può corrispondere in quanto non trova una cifra, quindi la corrispondenza successiva fallisce e l’operatore di corrispondenza restituisce le coppie già trovate

Nemmeno io capisco questo. “Se usi l’ancora \ G, forzerai la partita dopo il 22 per iniziare con a.” Ma senza il \ G si tenterà comunque l’abbinamento giusto? Allora, qual è il significato di questa frase?
Vedo che nell’esempio le sole coppie stampate sono 11 e 22. Quindi 44 non viene provato.

L’esempio mostra anche che l’utilizzo dell’opzione c rende l’indice 44 dopo un istante.

Ad essere onesti, da tutti questi non riesco a capire quale sia l’utilità di questo operatore e quando dovrebbe essere applicato.
Qualcuno potrebbe aiutarmi a capirlo, forse con un esempio significativo?

Aggiornare
Penso di non aver capito questa frase chiave:

Se si utilizza l’ancora \ G, si forza la corrispondenza dopo 22 per iniziare con la a. L’espressione regolare non può corrispondere in quanto non trova una cifra, quindi la corrispondenza successiva fallisce e l’operatore di corrispondenza restituisce le coppie già trovate.

Questo sembra significare che quando la corrispondenza fallisce, la regex non procede ulteriori tentativi ed è coerente con gli esempi nelle risposte

Anche:

Dopo che la corrispondenza fallisce con la lettera a, perl reimposta pos () e la corrispondenza successiva sulla stessa stringa inizia all’inizio.

\ G è un’ancora; indica dove è forzata l’inizio della partita. Quando \ G è presente, non può iniziare la corrispondenza in qualche punto successivo arbitrario della stringa; quando \ G è assente, può.

È molto utile per analizzare una stringa in parti discrete, in cui non si desidera saltare altre cose. Per esempio:

 my $string = " a 1 # "; while () { if ( $string =~ /\G\s+/gc ) { print "whitespace\n"; } elsif ( $string =~ /\G[0-9]+/gc ) { print "integer\n"; } elsif ( $string =~ /\G\w+/gc ) { print "word\n"; } else { print "done\n"; last; } } 

Uscita con \ G:

 whitespace word whitespace integer whitespace done 

senza:

 whitespace whitespace whitespace whitespace done 

Nota che sto dimostrando di usare il confronto scalare-contesto / g, ma \ G si applica allo stesso modo per elencare il contesto / g matching e infatti il ​​codice sopra è banalmente modificabile per usarlo:

 my $string = " a 1 # "; my @matches = $string =~ /\G(?:(\s+)|([0-9]+)|(\w+))/g; while ( my ($whitespace, $integer, $word) = splice @matches, 0, 3 ) { if ( defined $whitespace ) { print "whitespace\n"; } elsif ( defined $integer ) { print "integer\n"; } elsif ( defined $word ) { print "word\n"; } } 

Ma senza il \ G si tenterà comunque l’abbinamento giusto?

Senza il \G , non sarà vincolato per iniziare la corrispondenza lì. Ci proverò, ma proverà a partire più tardi, se necessario. Puoi pensare ad ogni pattern come se avesse un \G.*? implicito \G.*? davanti.

Aggiungi il \G e il significato diventa ovvio.

 $_ = "1122a44"; my @pairs = m/\G (\d\d)/xg; # qw( 11 22 ) my @pairs = m/\G .*? (\d\d)/xg; # qw( 11 22 44 ) my @pairs = m/ (\d\d)/xg; # qw( 11 22 44 ) 

Ad essere onesti, da tutti questi non riesco a capire quale sia l’utilità di questo operatore e quando dovrebbe essere applicato.

Come puoi vedere, ottieni risultati diversi aggiungendo un \G , quindi l’utilità è ottenere il risultato desiderato.

Le risposte interessanti e molte sono valide, credo, ma posso anche supporre che non sia ancora una spiegazione.

\ G “forza” la prossima partita a verificarsi nella posizione in cui è terminata l’ultima partita.

Fondamentalmente:

 $str="1122a44"; while($str=~m/\G(\d\d)/g) { #code } 

Prima partita = “11” La seconda partita è FORZATA PER INIZIARE alle 22 e sì, questo è \ d \ d, quindi il risultato è “22” Il terzo “tentativo” è FORZATO per iniziare da “a”, ma non è \ d \ d, quindi fallisce.