tester pattern regex perl substitution

regex - pattern - ¿En qué actúa el operador de sustitución de Perl?



perl substr (3)

He estado programando en Perl, de forma intermitente, durante años, aunque solo esporádicamente es mi idioma principal. Como a menudo paso meses sin escribir ningún perl, dependo mucho de mi Camel Book de orejas de perro para recordarme cómo hacer las cosas. Sin embargo, cuando copio recetas literalmente sin comprensión, esto me molesta. Este es uno de los más irritantes: en la página 154 de la 3ª edición de Camel, hay un ejemplo para "modificar strings en passant" , que dice así:

($lotr = $hobbit) =~ s/Bilbo/Frodo/g;

Q1) ¿qué está pasando aquí? ¿En qué exactamente opera la expresión regular?

Q2) ¿Es necesaria esta sintaxis casi mágica para una operación tan básica como "tomar una cadena de $ a, modificarla con una expresión regular, colocar el resultado en $ b"?

Q3) ¿Cómo hago esta operación usando la variable predeterminada del ciclo como la cadena inicial?

Disculpas de antemano a los soñadores de Perl para quienes lo de arriba parece perfectamente natural.


Diferentes idiomas hacen cosas diferentes con el operador de asignación. En algunos, es una declaración, no una expresión, por lo que no se puede combinar en una expresión más grande. En algunos, devuelve el valor asignado, pero solo como un valor (a menudo llamado valor r), no como algo que se puede modificar o asignar (un valor l). Un ejemplo de esto es C, donde puedes escribir:

a = b = c; # assign value of c to b and a

pero no:

++(b = a); # assign value of a to b, then increment b

Y en algunos, el resultado de una tarea es el lvalue asignado. (En Perl, esto se aplica solo a las asignaciones escalares, las asignaciones de listas son una bestia más compleja). Por lo tanto, puede hacer ++ ($ b = $ a) o ($ b = $ a) = ~ s / a / b / o cualquier otra operación que espera un valor l en la asignación, y primero hará la asignación y luego modificará el valor l asignado.


Hmmm ... ($lotr=$hobbit) =~ s/Bilbo/Frodo/g es una de las muchas magias de Perl. Ahora para algunas respuestas.

Q1) $lotr se le está asignando el valor contenido en $hobbit . Después de la tarea, podemos olvidarnos de la variable fuente. Treat ($lotr = $hobbit) como su propia declaración como si hubiéramos escrito:

$lotr = $hobbit; $lotr =~ s/Bilbo/Frodo/g;

en lugar. La expresión regular está funcionando en $lotr .

Q2) La sintaxis es simplemente una versión de una línea del fragmento dado anteriormente. Piense en ello como "copie el hilo de $a , cópielo en $b y modifique $b con la expresión regular" en lugar de "tome una cadena de $a , modifíquela con una expresión regular, coloque el resultado en $b "

P3) ¿Asumo que te refieres al espacio predeterminado de búsqueda de patrones por "variable predeterminada del ciclo"? En ese caso, solo use $_ lugar de $hobbit :

while (<>) { chomp; ($lotr = $_) =~ s/Bilbo/Frodo/g; print "/$lotr = [$lotr]/n"; print "/$_ = [$_]/n"; }

Curiosamente, la magia var $_ no se modifica con esta operación. Así es como se puede concluir que la asignación ocurre antes de la sustitución de expresiones regulares y que la sustitución no interactúa en el espacio de patrones predeterminado de ninguna manera.

Y para los experimentados programadores de Perl ... no conozco demasiadas personas que se sientan atraídas por alguna sintaxis de Perl, independientemente de cuánto tiempo hayan estado mirando, por supuesto, señor Schwartz;


Si en la Q2 intentas tomar una subcadena de $ a, podrías encontrar esta expresión útil:

($b) = $a =~ /(substring-to-match)/; $b =~ s/regex-on-susbtring/result-string/;

También tenga en cuenta que $ a y $ b no son variables normales en Perl ya que tienen reglas de alcance especiales relacionadas con la función de ordenación. Ver ''perldoc perlvar'' para más detalles.