comprensión de una construcción simple de Perl
Frecuentes
Visto 160 veces
0
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
1 Respuestas
2
# 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 perl or haz tu propia pregunta.
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
@TLP, está bien, gracias. no conocía codepart.org hasta ahora :) - user1340802