2012-02-08 14 views
8

¿Esta línea de Perl realmente hace algo?

$variable =~ s/^(\d+)\b/$1/sg; 

La única cosa que puedo pensar es que puede ser reutilizado o $1$&, pero es seguida inmediatamente por.

$variable =~ s/\D//sg; 

Con estas dos líneas juntas, ¿la primera línea no tiene sentido y es extraíble? Parece que sería, pero lo he visto muchas veces en este viejo programa y quería asegurarme.

Respuesta

12
$variable =~ s/^(\d+)\b/$1/sg; 
  • El ancla ^ al principio hace que el modificador /g inútil.
  • La falta del carácter comodín . en la cadena hace que el modificador /s sea inútil, ya que sirve para hacer que . también coincida con la línea nueva.
  • Dado que \b y ^ son aseriones de ancho cero, y las únicas cosas fuera del grupo de captura, esta sustitución no cambiará la variable en absoluto.

Lo único que hace esta expresión regular es capturar los dígitos en $1, si se encuentran.

La expresión regular posterior

$variable =~ s/\D//sg; 

eliminará todos los no-dígitos, por lo que la variable sólo un número largo. Si uno quisiera separar la primera parte (emparejada por la primera expresión regular), la única forma de hacerlo sería accediendo al $1 desde la primera expresión regular.

Sin embargo, la primera expresión regular en ese caso sería mejor escrito simplemente:

$variable =~ /^(\d+)\b/; 

Y si se supone que la captura que se utilizará:

my ($num) = $variable =~ /^(\d+)\b/; 
6

es el "modo mancha" en uso? (La secuencia de comandos se invoca con la opción -T).

Tal vez se usa para desinfectar (es decir, no marcado) la entrada del usuario.

+0

No, no se usó, ¡pero muy interesante! Nunca supe de esto –

+0

+1 Ese es un posible uso para él. Buena atrapada. – TLP

Cuestiones relacionadas