necesito implementar un programa para contar la ocurrencia de una subcadena en una cadena en perl. Lo he implementado de la siguiente manera¿Cómo puedo contar las subcadenas superpuestas en Perl?
sub countnmstr
{
$count =0;
$count++ while $_[0] =~ /$_[1]/g;
return $count;
}
$count = countnmstr("aaa","aa");
print "$count\n";
ahora esto es lo que normalmente haría. sin embargo, en la implementación anterior quiero contar la ocurrencia de 'aa' en 'aaa'. Aquí recibo una respuesta como 1, que parece razonable, pero también tengo que considerar los casos superpuestos. por lo tanto, el caso anterior debería dar una respuesta como 2 ya que hay dos 'aa si consideramos la superposición.
¿alguien puede sugerir cómo implementar tal función?
Puede utilizar el llamado "operador goatse" (en realidad no es un operador) para obtener un recuento en una sola pasada: 'mi $ count =() = $ cadena = ~/$ subcadena/g;' . Esto no soluciona la detección de subcadenas superpuestas. Voy a IR en el próximo comentario. – daotoad
El "operador de cabras" o GO funciona porque cuando se evalúa en contexto escalar, la asignación a una lista devuelve la cantidad de elementos proporcionados para la asignación. Considere este ejemplo: '$ foo =() = (1,3,2,9) ';', la lista de números se asigna a la lista vacía. Todos los valores se descartan, pero la asignación en sí se evalúa para obtener el valor de '$ foo'. Como '$ foo' es un escalar, evaluamos la asignación de lista y obtenemos' 4'. Por lo tanto, GO puede usarse para eliminar una matriz temporal inútil. – daotoad