Recuento de coincidencias de expresiones regulares en Perl

Estoy haciendo coincidir una cadena de la forma A <=> B! C <=> D! E <=> F ... y quiero verificar las letras. Básicamente quiero saber si las letras están en la clase de acuerdo con un hash que he definido. Tuve la idea de hacer la siguiente expresión regular y luego recorrer las cadenas coincidentes:

$a =~ /(.)<=>(.)/g;

Pero no puedo decir cuántas variables de $ 1, $ 2 han coincidido. ¿Cómo sé cuántos hay? Además, ¿hay una mejor manera de hacer esto? Estoy usando Perl 5.8.8.

preguntado el 28 de agosto de 11 a las 00:08

3 Respuestas

Querrá que el operador 'countof' cuente el número de coincidencias:

my $count = () = $string =~ /(.)<=>(.)/g;

Reemplazar la lista vacía con una matriz retendrá las coincidencias:

my @matches = $string =~ /(.)<=>(.)/g;

Lo que proporciona otra forma de obtener $count:

my $count = @matches;   # scalar @matches works too

Respondido 28 ago 11, 04:08

Utilizar while loops

use warnings;
use strict;

my %letters = map { $_ => 1 } qw(A C F);
my $s = 'A<=>B!C<=>D!E<=>F';
while ($s =~ /(.)<=>(.)/g) {
    print "$1\n" if exists $letters{$1};
    print "$2\n" if exists $letters{$2};    
}

__END__

A
C
F

Respondido 28 ago 11, 04:08

¿Crear una variable e incrementarla cada vez que pasa por su ciclo?

Respondido 28 ago 11, 04:08

Sí, pero ¿cuáles son los límites de mi bucle? Podría tomar la longitud de la cuerda y dividir, pero esperaba una solución más general. - Kat

No necesita límites si usa el tipo de bucle adecuado, como muestra la respuesta de Toolic. - Amber

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.