• Publicidad

Mostrar solo parte de un fichero

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

Mostrar solo parte de un fichero

Notapor paloman » 2011-11-14 15:46 @698

Hola, sigo aquí poco a poco dando primeros pasos con el Perl, cuando buenamente puedo. Veréis, es una duda bastante básica.

Quisiera conseguir abrir ficheros .html de los cuales coger cierta parte (en este caso el texto que me interesa es el que en el código fuente del html sale entre <!-- google_ad_section_start --> y <!-- google_ad_section_end --> ) e ir metiendo todas las partes en un único fichero de texto (index.txt por ejemplo).

Bien, entre lo que he encontrado por ahí y lo poco que he hecho yo, de momento he conseguido hacer funcionar dos pequeños códigos, uno que saca en pantalla lo del html:

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. use strict;
  2. use HTML::Parser;
  3. my $file = 'presss.html';
  4. my $parser = HTML::Parser->new( text_h => [ \&text_handler,"self,dtext"],
  5.                                 start_document_h => [\&init, "self"] );
  6.                                                                                  
  7. $parser->parse_file($file);
  8.  
  9. print @{$parser->{_private}->{text}};
  10.  
  11. sub init
  12. {
  13.    my ( $self ) = @_;
  14.    $self->{_private}->{text} = [];
  15. }
  16.  
  17. sub text_handler
  18. {
  19.     my ( $self, $text) = @_;
  20.     push @{$self->{_private}->{text}}, $text;
  21. }
  22.  
Coloreado en 0.003 segundos, usando GeSHi 1.0.8.4


(Creo que muestra todo el texto excepto las etiquetas.)

Y otro que me abre un fichero (general.txt) en el que me añade al final lo del otro archivo (index.txt):
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. $file = "general.txt";
  2.  
  3. open (FILE, ">>$file") or die "Can't open $file: $!\n";
  4. @lines = <FILE>;
  5. while(my @lines = <FILE>){
  6.         print "@lines\n";
  7. }
  8. close FILE;
  9.  
  10.  
  11. open (STDOUT, ">>$file") or die "Can't open $file: $!\n"; #con el >> se añade el siguiente texto al archivo guardado
  12.  
  13. $abrir = "index.txt";
  14.  
  15. open(AE,"$abrir") or die;
  16. while(my $reng=<AE>){
  17.         print "$reng\n";
  18. }
  19. close(AE);
  20.  
  21. #Walk through lines, putting into $_, and substitute 2nd away
  22. for ( @lines ) {
  23.     s/(.*?away.*?)away/$1yellow/;
  24.     print "line";
  25. }
  26. close STDOUT;
  27.  
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


Ahora querría hacer uno que me hiciera lo que comento al principio: que me abriese únicamente parte de un html (para luego ya unirlo a las demás partes y conseguir un programa que me pueda ejecutar:

Abrir parte del contenido de un HTML --> Grabar dicho contenido en un .txt --> Añadir ese .txt a un arhivo general.txt


P.D.:
a) realmente no sé cómo utilizar la sentencia if() o si esta es la mejor opción para ello
b) no sé si tendría que indicarle que acote por las etiquetas (ya que el programilla ese que he pillado de html to txt no las imprime en patalla, o debo acotar de otra forma
c) o si se podría, por ejemplo, indicar que acote desde que en pantalla muestre XYZW hasta que haya dos "\n" seguidos... o ¿cómo hacerlo?


P.P.D:
agradezco cualquier tipo de ayuda, no sé programar y me estoy volviendo loco porque tengo que tratar una serie de textos por un tema lingüístico y me han indicado que el Perl es mi mejor opción para ello, pero ya veis que apenas sé hacer nada con él (más que avanzar un mínimo me está suponiendo gran cantidad de esfuerzo y horas de las que casi no dispongo).

Un saludo y muchas gracias.
paloman
Perlero nuevo
Perlero nuevo
 
Mensajes: 3
Registrado: 2011-10-30 17:29 @770

Publicidad

Re: Mostrar solo parte de un fichero

Notapor explorer » 2011-11-14 16:16 @720

Una de las partes fundamentales del lenguaje Perl (y de otros lenguajes) son las expresiones regulares. Deberías prestarles un poco de atención porque, con este tipo de problemas, los resolverás muy fácilmente y en muy poco espacio.

Por ejemplo, para sacar todos los textos que estén dentro de esas marcas, en un $html, se puede hacer así:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. while( $html =~ /<!-- google_ad_section_start -->(.+?)<!-- google_ad_section_end -->/gsm) {
  2.     say $1;
  3. }
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4

Y fíjate que no tienes que preocuparte de la estructura del fichero html. Simplemente tratamos el $html como un bloque de texto. Y buscamos cadenas dentro de él.

En cuanto al código que pones, me parece que está mal, entre las líneas 4 y 7. De hecho, estás leyendo dos veces, el fichero entero (en las líneas 4 y 5). Pero es que, además, no está leyendo el fichero en modo lectura, sino en modo agregar ('>>'), así que, en teoría, no deberías leer el fichero.

Si lo que quieres es agregar el contenido de index.txt a general.txt, se haría (una de muchas maneras) así:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. open( FILE, '<index.txt');
  2. my @index = <FILE>;
  3. close FILE;
  4.  
  5. open( SALIDA, '>>general.txt');
  6. print SALIDA @index;
  7. close SALIDA;
Coloreado en 0.001 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


Volver a Básico

¿Quién está conectado?

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