2009-02-02 15 views

Respuesta

8
s/(?=..$)/:/ 

No utilice la sugerencia de $& de huevas. perldoc perlvar:

El uso de esta variable en cualquier lugar de un programa impone una penalización de rendimiento considerable en todas las coincidencias de expresiones regulares. Ver "ERRORES".

+0

Como siempre, hay más de una forma. Hay una penalización de rendimiento, sí, pero fue el primer patrón que se me vino a la mente (sí, por supuesto, soy un sedán, por supuesto), y probablemente sea lo suficientemente rápido en este caso, ¿no crees? :) – falstro

+0

fue lo suficientemente rápido ... de todos modos es un script muy pequeño ... la solución de ayrnieu también funcionó – CheeseConQueso

+0

El punto no es si es rápido o no. El punto es que los recién llegados no deben acostumbrarse a usar $ & en primer lugar. – innaM

1

Usted podría intentar esto:

s/..$/:$&/ 

que coincide con-dos caracteres al final de la cadena, y lo reemplaza con dos puntos y la cadena coincidente (es decir, los dos caracteres).

EDITAR
fijo sed-backref a la perl equivalente.

+0

ok gracias ... sí me iba a decir que no estaba trabajando – CheeseConQueso

+0

agradable .. no es – CheeseConQueso

+0

Ok, por lo que ISN' la expresión más optimizada, pero es fácil de entender y lo hace, ¿cómo fue eso inútil (como en downvote)? ¿No está votando la mejor respuesta de la manera SO? – falstro

-2

El equivalente de Perl de sed & es $ &, por lo que debe ser: respuesta

$s = s /..$/:$&/s; 
0

de huevas de "obras", pero su expresión regular en lugar inobvious.

Me gustaría ir a por más

s/(^.*)(..$)/$1:$2/ 

porque acabo de amor backrefs.

Su exageración por lo que estás haciendo, pero para mí es más semánticamente expresivo.

+0

la primera captura se desperdicia un poco, ¿por qué no simplemente s /(..$)/:$ 1 /? – user55400

+0

Aunque la primera parte es realmente redundante, es mucho más legible. (Al menos en la forma en que analizo la expresión regular) –

+0

+1 blixtor. @Kent: aunque en este caso no hay ninguna diferencia práctica, tu respuesta original es más lenta ya que Perl necesitará dar marcha atrás a dos personajes para que coincidan con el "..." final. Si ese ".." fuera una expresión más complicada, el ". *" Inicial podría hacer que sea * mucho * más lento. –

9

se puede también utilizar así .....

my $string = "1200"; 
substr $string, -2, 0, ':'; 

# $string => '12:00'; 
+0

Me imagino que el substr() es significativamente más rápido, más fácil de leer y más intuitivo. –

+0

Más intuitivo solo si no conoce las expresiones regulares lo suficientemente bien. – PEZ

+0

este parece intuitivo ... no sé por qué, pero creó 20 ~ líneas en el archivo csv y luego tomó un volcado y me dio este error ... substr fuera de cadena en ./test3 línea 237. - mi mejor conjetura es que se ejecutó en un valor de 0, lo que sucede en mis datos y no es información incorrecta, solo implica un evento diff – CheeseConQueso

Cuestiones relacionadas