comprensión de una construcción simple de Perl

como programador que no es de Perl, me gustaría estar seguro de haber entendido bien una construcción que voy a portar a Python,

cuando usas :

if (s/^([$PChar])(.)/$2/) {
  print $1,"\n";
  $finished = 0;
}
  • $1, $2, etc. coinciden con la expresión regular
  • s/buscar/reemplazar con/

lo que realmente no estoy seguro es si la coincidencia/reemplazo se realiza antes de imprimir $ 1? y se hace "en su lugar" dentro del búfer actual (que es $F, es decir $_ línea por línea leída, dividida en su carácter de espacio), eso lo está cambiando (así que si lo entiendo bien, el ([$PChar]) cuando @ comienzo de una cadena está totalmente eliminado/perdido en la declaración anterior)?

EDITAR: no, tal vez no se pierda, se captura la primera parte del paréntesis y luego se imprime como $ 1 + carácter de nueva línea y luego ... no, no entiendo qué se convirtió en $ 2 ... ¿puede ser un cambio de búfer a la segunda parte del paréntesis? /FIN DE EDICION.

¿También hay algún entorno o cuál es el mejor entorno que permite hacer una depuración paso a paso en la plataforma Win? Soy consciente de que teniendo esto, no habré hecho esta pregunta. Y no necesito aprender Perl, solo para poder leer y adaptar este script.

aquí está la parte envolvente:

@F = split;
for( $j=0; $j<=$#F; $j++) {
  my $suffix="";
  $_ = $F[$j];
  # separate punctuation and parentheses from words
  do {
$finished = 1;
# cut off preceding punctuation
if (s/^([$PChar])(.)/$2/) {
  print $1,"\n";
  $finished = 0;
}
# cut off trailing punctuation
if (s/(.)([$FChar])$/$1/) {
  $suffix = "$2\n$suffix";
  $finished = 0;
}

Se puede ver el script completo tokenize.pl aquí mientras original tar.bz si de aquí

saludos cordiales

preguntado el 03 de mayo de 12 a las 09:05

Si va a publicar un código de muestra, no publique un archivo tar.gz, copie y pegue el texto sin formato en algún teclado en línea, como codepad.org. -

@TLP, está bien, gracias. no conocía codepart.org hasta ahora :) -

1 Respuestas

# try to delete the first character from the string contained in
# $_ if that character is one of the characters contained in
# the string $PChar. The deletion is done by replace the first and
# second character by only the second character.
if (s/^([$PChar])(.)/$2/) {

  # if the replacement was successful, print the deleted character.
  print $1,"\n";
  $finished = 0;
}

contestado el 03 de mayo de 12 a las 09:05

Los comentarios de la pregunta sugieren que $PChar tiene una cadena de signos de puntuación. No miré el alquitrán, pero supongamos $PChar = '\.,:;]'. entonces ([$PChar]) capturaría exactamente uno de los personajes ., ,, :, ;. Una forma más fácil de lograr lo mismo sería simplemente dejar el segundo paréntesis y decir s/^([$PChar])// porque no toca el siguiente carácter de todos modos. - Simbabque

y luego el resto del proceso continúa con solo la cadena que comienza con el segundo carácter como nuestro nuevo búfer $_? o continuamos con toda la cadena sin cambios como $_? Simbabque: sí, en realidad son signos de apertura de puntuación como paréntesis de apertura. - user1340802

@user1340802: Los reemplazos están en línea, lo que significa que el contenido de $_ cambiarse (primer carácter descartado). - coadicto

Este planteamiento de « podría ser el guión que está mirando - TLP

@TLP, sí lo es :) gracias. Lo siento, no he encontrado este, ya que es un espejo del sitio web original que señalé. - user1340802

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.