• Publicidad

Problema con remplazo de un string

¿Apenas comienzas con Perl? En este foro podrás encontrar y hacer preguntas básicas de Perl con respuestas aptas a tu nivel.

Problema con remplazo de un string

Notapor brianstanley » 2011-10-22 21:03 @919

¿Qué tal, amigos perleros? Mi problema es el siguiente:

Estoy haciendo un script que remplace una determinada línea dentro de un archivo de texto. Estuve leyendo tutoriales pero según los tutoriales que vi, para abrir archivos en modo lectura hace esto:

open(LECTURA,">> cableado") || die "No pudo abrirse: $!";

lo abre en modo escritura y escribe al final del código

open(LECTURA,"> cableado") || die "No pudo abrirse: $!";

escribe al inicio del código.

Pero lo que yo quiero hacer es que escriba en solo determinadas líneas. Más o menos ya lo sé cómo hacer pero no tengo idea de cómo abrir el código para remplazar las líneas que quiero.

Hasta ahora tengo esto:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. #!/usr/local/perl
  2. my $url= 'index.html';
  3.  
  4. open(DATOS,"index.html");
  5. while(<DATOS>) {
  6.   chomp;
  7.   if ($_ =~ m/facebook) {
  8.   print "se encontro";
  9.  
  10. }else{
  11. print "No se encontro";
  12. }
  13. }
Coloreado en 0.003 segundos, usando GeSHi 1.0.8.4


y me arroja esto:
Search pattern not terminated at escribir.pl line 7.

Saludos a todos
brianstanley
Perlero nuevo
Perlero nuevo
 
Mensajes: 8
Registrado: 2011-10-16 16:58 @749

Publicidad

Re: Problema con remplazo de un string

Notapor explorer » 2011-10-22 21:37 @942

El error es muy claro: el patrón de búsqueda no está correctamente terminado: te falta un '/' al final del patrón.
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14486
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Re: Problema con remplazo de un string

Notapor brianstanley » 2011-10-23 00:54 @079

Disculpa, ahí arreglé el tema. Es que yo quiero, dentro de un string, reemplazar solo ese string y no poner abajo de todo el código o arriba de todo, ¿cómo lo puedo hacer?

Hasta ahora tengo esto pero me agrega al final del código el string.
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. #!/usr/local/perl
  2. my $url   = 'index.html';
  3. my $barra = "/";
  4. open( DATOS, "index.html" );
  5. while (<DATOS>) {
  6.     chomp;
  7.     if ( $_ =~ m/src=/ ) {
  8.         $_ =~ s/src=\"/src=facebook.com$barra/g;
  9.  
  10.         print "se encontró\n:$_";
  11.  
  12.         open( MANEJADOR, ">~index.html" ) or die 'no se encontró el archivo';
  13.  
  14.         print MANEJADOR $_;
  15.  
  16.     }
  17.     else {
  18.         print "No se encontró \n";
  19.     }
  20. }
  21.  
Coloreado en 0.002 segundos, usando GeSHi 1.0.8.4
brianstanley
Perlero nuevo
Perlero nuevo
 
Mensajes: 8
Registrado: 2011-10-16 16:58 @749

Re: Problema con remplazo de un string

Notapor explorer » 2011-10-23 13:57 @623

El código que muestras debería ser suficiente para cambiar todas las apariciones de 'src=', por la modificación que indicas.

Pero... estás modificando el fichero en cada ocasión que encuentras la cadena.

La solución es leer todo el fichero de golpe, hacer la sustitución, y grabar el resultado.

Algo así (no probado):
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. #!/usr/local/perl
  2. my $url   = 'index.html';
  3.  
  4. open $DATOS, '<', $url or die "ERROR: No puedo leer el fichero $url: $!\n";
  5. local $/;                     # modo succionador
  6. my $html = <$DATOS>;          # ¡Yum!
  7. close $DATOS;
  8.  
  9. $html =~ s{src="}{src="facebook.com/}g;    # ¡zas!
  10.  
  11. open  $MANEJADOR, '>', "~$url" or die "ERROR: No puedo escribir en el archivo ~$url: $!\n";
  12. print $MANEJADOR $html;        # ¡Pum!
  13. close $MANEJADOR;
Coloreado en 0.002 segundos, usando GeSHi 1.0.8.4

Otra opción: desde la línea de comandos:
Sintáxis: [ Descargar ] [ Ocultar ]
Using bash Syntax Highlighting
  1. perl -p -i.bak -e 's{src="}{src="facebook.com/}g' index.html
Coloreado en 0.003 segundos, usando GeSHi 1.0.8.4
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14486
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Re: Problema con remplazo de un string

Notapor brianstanley » 2011-10-25 19:59 @874

¿Me ayudarías a entender un poco más el código que pusiste?

Gracias :)

Por ejemplo, cuando defines LOCAL $/ ¿qué sería la función de eso?

¿También me puedes a ayudar entender la lógica que aplicaste aquí?

$html =~ s{src="}{src="facebook.com/}g; # ¡zas!

Gracias :)
brianstanley
Perlero nuevo
Perlero nuevo
 
Mensajes: 8
Registrado: 2011-10-16 16:58 @749

Re: Problema con remplazo de un string

Notapor explorer » 2011-10-25 21:49 @951

Con local $/; estamos indicando varias cosas...
  • $/ es una variable especial que indica cómo es el separador entre los registros de entrada, en el momento de la lectura del fichero. Por defecto, es el avance de línea, por lo que, efectivamente, un fichero de texto normal lo podemos leer línea a línea.
  • Con local(), almacenamos el valor anterior de $/ (el que sea) en una memoria temporal, y asignamos un nuevo valor a $/. El caso es que... no estamos indicando ningún nuevo valor, así que estamos almacenando el valor 'undef' en $/
  • Si $/ tiene el valor "indefinido", quiere decir que no esperamos ningún delimitador entre registros de entrada, por lo que, en la primera lectura del fichero, lo leeremos completamente.
Más información en perldoc perlvar.

$html =~ s{src="}{src="facebook.com/}g; # ¡zas!

es una expresión regular, usando el operador sustitución (s///) aplicado a la variable escalar $html. Buscamos por 'src=' y lo sustituimos por 'src="facebook.com/', de forma repetida a lo largo de todo el texto (/g).

La variable $html almacena todo el fichero. Se aplica la expresión regular, que hará los cambios en todos los lugares donde encuentre el patrón de búsqueda.

Como detalle curioso, en lugar de usar los delimitadores '/' en el operador s///, usamos llaves emparejadas, ya que, dentro de uno de los patrones (el de sustitución), ya contiene un carácter '/'. Se podría solventar escapándolo así:

$html =~ s/src="/src="facebook.com\//g; # ¡zas!

pero, con las llaves, queda más claro.

Y el '# ¡zas!', es un comentario.

Más información en peldoc perlop, en la sección Regexp Quote-Like Operators.
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14486
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Re: Problema con remplazo de un string

Notapor brianstanley » 2011-10-27 22:02 @959

Gracias por tu respuesta :D

Estoy tratando de hacerlo funcionar pero no estoy pudiendo. Lo que noto es que, por ejemplo, viste cuando haces la sustitución:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. $html =~ s/src="/src="facebook.com\//g; # ¡zas!
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


Lo haces afuera del gestor DATOS. Por ejemplo, si hago un print() a $html antes de hacer la sustitución no me tira nada:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. open $DATOS, '<', $url or die "ERROR: No puedo leer el fichero $url: $!\n";
  2. local $/;                     # modo succionador
  3. my $html = <$DATOS>;          # ¡Yum!
  4.  
  5. close $DATOS;
  6.  
  7. print $html;
  8. $html =~ s/src="/src="facebook.com\//g; # ¡zas!
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


Es como que si hubiera quedado guardado los datos en $html, en cambio si al print $html lo hago adentro del gestor, antes del close(), sí me imprime.

Espero que me halla explicado bien. Cualquier cosa me preguntas, ¡je,je! Gracias :D
brianstanley
Perlero nuevo
Perlero nuevo
 
Mensajes: 8
Registrado: 2011-10-16 16:58 @749

Re: Problema con remplazo de un string

Notapor explorer » 2011-10-27 22:19 @971

Pues no lo entiendo que no salga nada... a mi me funciona...

La variable $html almacena los contenidos de toda la página almacenada en el fichero indicado por $url...
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14486
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España


Volver a Básico

¿Quién está conectado?

Usuarios navegando por este Foro: No hay usuarios registrados visitando el Foro y 2 invitados

cron