2010-12-07 11 views

Respuesta

0
$str=~ s/(.)\1+/$1/g; 
9

(Este es el official perlfaq answer, menos las ediciones posteriores)

Usted puede utilizar el operador de sustitución para encontrar los pares de caracteres (o series de caracteres) y reemplazarlos con una sola instancia. En esta sustitución, encontramos un personaje en (.). Los paréntesis de memoria almacenan el carácter coincidente en la referencia posterior \g1 y lo usamos para exigir que lo siga inmediatamente. Reemplazamos esa parte de la cadena con el personaje en $1.

s/(.)\g1/$1/g; # 5.10 or later 
s/(.)\1/$1/g; # earlier versions 

También podemos utilizar el operador de transliteración, tr///. En este ejemplo, el lado de la lista de búsqueda de nuestro tr/// no contiene nada, pero la opción c lo complementa así que contiene todo. La lista de reemplazo tampoco contiene nada, por lo que la transliteración es casi nula ya que no hará ningún reemplazo (o más exactamente, reemplazará al personaje consigo mismo). Sin embargo, los s calabazas opción duplicados y caracteres consecutivos en la cadena para un personaje no aparece junto a sí

my $str = 'Haarlem'; # in the Netherlands 
$str =~ tr///cs;  # Now Harlem, like in New York 
+0

Cuando hizo eso 'G '(en' \ g1') de deslizamiento ahí? No está en el POD para 5.12.1 pero puedo verlo en github. ¿Es una cosa futura (5.13+)? –

+3

La construcción '\ g' se introdujo en' 5.10.0'. De 'perl5100delta': * Una nueva sintaxis' \ g {N} 'o' \ gN' donde "N" es un entero decimal permite una forma más segura de la notación de retrospección, así como también permite referencias retrospectivas relativas. * –

+0

No hay necesita, más allá de * OBLIGATORIO * 5.10, usar eso sobre \ 1 en esta respuesta. – MkV

0

Ésta es la respuesta de perlfaq4 de la última versión estable:

¿Cómo se quita pares consecutivos de personajes?

(aportado por Brian D Foy)

Usted puede utilizar el operador de sustitución para encontrar los pares de caracteres (o series de caracteres) y reemplazarlos con una sola instancia. En esta sustitución, encontramos un personaje en (.). Los paréntesis de memoria almacenan el carácter coincidente en la referencia-atrás \ 1 y lo usamos para requerir que lo siga inmediatamente. Reemplazamos esa parte de la cadena con el personaje en $ 1.

s/(.)\1/$1/g; 

También podemos utilizar el operador de transliteración, tr ///. En este ejemplo, el lado de la lista de búsqueda de nuestro tr /// no contiene nada, pero la opción c complementa eso para que contenga todo. La lista de reemplazo tampoco contiene nada, por lo que la transliteración es casi nula ya que no hará ningún reemplazo (o más exactamente, reemplazará al personaje consigo mismo). Sin embargo, las calabazas opción s duplicados y caracteres consecutivos en la cadena para un personaje no aparece junto a sí

my $str = 'Haarlem'; # in the Netherlands 
$str =~ tr///cs;  # Now Harlem, like in New York 
+0

Si es posible, sería genial para el autor publicar la respuesta él mismo (es decir, que Brian publique su nueva respuesta desde estable o maestro). – Ether

+2

@Ether y @MkV Brian y yo estamos publicando estas preguntas usando http://stackoverflow.com/users/532928/perlfaq usando la versión disponible en http://faq.perl.org/ Las preguntas se publican usando 'perlfaq 'cuenta para que no obtengamos su representante y las respuestas se marcan en CW para que sea más fácil mejorar las respuestas. No veo mucho un punto en la publicación de versiones casi idénticas de las respuestas (para ganancia de representante) en lugar de editar la existente. –

+0

@Sinan: está bien, lo malentendí; Tenía la impresión de que había una respuesta radicalmente diferente para algunas preguntas en blead que la versión "publicada oficialmente". Si las diferencias son sutiles, estoy de acuerdo con simplemente editar la respuesta existente. – Ether

Cuestiones relacionadas