• Publicidad

Comparar páginas Perl

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

Re: Comparar páginas Perl

Notapor explorer » 2011-07-12 17:33 @773

1) ¿Qué cosas salen? Si no pones el resultado del ejemplo, es difícil de saberlo. La exp. reg. <p>(.+?)< captura lo que hay después de un <p>, pero no está garantizado que el '<' final corresponda a un </p>.

2) Pues no tengo ni idea de dónde sale el <a>... Podría estar en otra parte del documento.
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14480
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Publicidad

Re: Comparar páginas Perl

Notapor jacks » 2011-07-13 12:11 @549

Humm... Sobre tus respuestas:

2)
Sintáxis: [ Descargar ] [ Ocultar ]
Using html4strict Syntax Highlighting
  1. <h2>Access control and identification</h2>
  2.                                                         <p class="preamble">Security monitoring and access control without physical contact – made possible by RFID-enabled ASSA ABLOY products. </p>
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4

quiero poner lo que hay entre <h2>..</h2> como título y lo que hay entre <p>... como descripción. Quizás si hago mención alguna etiqueta más que esté delante de <h2> me saque el título en vez de ese <a href...

Y otra cosa:

1) Quiero sacar lo que hay entre <h2> como título pero me lo saca vacío, y la coma desplazada al siguiente párrafo. ¿Cómo puedo hacerlo?

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. while ($html =~ m{<BR>.+?<h2>(.+?)<span .+?>.+?<h3>.+?<p>(.+?)<}smg) {         
  2.  
  3.         # print "[$1][$2][$3]\n";                                      
  4.        push(@list,{                            
  5.        
  6.             Link        => "",                                         
  7.             title       => $1,
  8.             description => $2,
  9.         });
  10.  
Coloreado en 0.002 segundos, usando GeSHi 1.0.8.4


Sintáxis: [ Descargar ] [ Ocultar ]
Using text Syntax Highlighting
$VAR1 = [
          {
            'title' => '

',
            'description' => 'CompX Security Products is the leader in custom design and manufacturing of keyless entry systems for a large variety

of applications. We utilize the latest technological advances such as: ',
            'Link' => ''
          }
        ];

    }
 
Coloreado en 0.000 segundos, usando GeSHi 1.0.8.4


Sintáxis: [ Descargar ] [ Ocultar ]
Using html4strict Syntax Highlighting
  1. <BR>
  2.  
  3. <h2>Be in control with CompX eLock<span style="vertical-align:super;font-size:50%">&reg;</span></h2>
  4.  
  5. <h3>
  6. <p>CompX Security Products is the leader in custom design and manufacturing of keyless entry systems for a large variety
  7. of applications. We utilize the latest technological advances such as: <a href="/products-elockkp.html">Keypads</a>,
  8. <a href="/products-elockmag.html">Magnetic Stripe</a>, and HID <a href="/products-elockpr.html">Proximity</a> to provide unique
  9. locking solutions to many industries. Just a few of the markets we currently serve include: Tool Storage, Medication Carts,
  10. Hospitals, Pharmacies, Refrigeration, Server Racks, File Cabinets, Lockers, Patient Records, Supply Cabinets, etc.</p>
  11.  
  12. </h3>
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4
jacks
Perlero nuevo
Perlero nuevo
 
Mensajes: 148
Registrado: 2011-04-05 11:14 @510

Re: Comparar páginas Perl

Notapor explorer » 2011-07-13 12:55 @579

A mí sí que me funciona...
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. #!/usr/bin/perl
  2. use Modern::Perl;
  3. use autodie;
  4. use File::Slurp;
  5.  
  6. my $html = read_file('code_27068_3.txt');
  7.  
  8. #say $html;
  9.  
  10. while ($html =~ m{<BR>.+?<h2>(.+?)<span .+?>.+?<h3>.+?<p>(.+?)<}smg) {
  11.  
  12.     say "Título: [$1]";
  13.     say "Descripción: [$2]";
  14. }
  15.  
  16. __END__
  17. Título: [Be in control with CompX eLock]
  18. Descripción: [CompX Security Products is the leader in custom design and manufacturing of keyless entry systems for a large variety
  19. of applications. We utilize the latest technological advances such as: ]
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: 14480
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Re: Comparar páginas Perl

Notapor jacks » 2011-07-14 10:29 @478

Hola. Para intentar solucionar el problema que tengo a la hora de pasarle los parámetros de un programa a otro he hecho un script de prueba:


(prueba.pm):
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. #!c:/perl/bin
  2.  
  3. package prueba;
  4. use strict;
  5. use warnings;
  6.  
  7. sub mostrar {
  8.        
  9.         my($no,$se);
  10.  
  11.         $no = $_[0];
  12.  
  13.         $se = $_[1];
  14.        
  15.         printf ("El nombre es:  \n");
  16.  
  17.         printf ("$no\n");
  18.  
  19.         printf ("El sector es:  \n");
  20.  
  21.         printf ("$se\n");
  22.  
  23.  
  24. }
  25.  
  26.  
  27.  
  28. my($nombre,$sector);
  29.  
  30. $nombre = $_[0];
  31.  
  32. printf ("El nombre es:  \n");
  33.  
  34. printf ("$nombre");
  35.  
  36. $sector = $_[1];
  37.  
  38. printf ("El sector es:  \n");
  39.  
  40. printf ("$sector");
  41.  
  42. &mostrar($nombre,$sector);
  43.  
  44.  
  45. 1;
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


(probar.pl):

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. #!c:/perl/bin
  2.  
  3. use strict;
  4. use warnings;
  5. use prueba;
  6.  
  7. my($nombre,$sector);
  8.  
  9. $nombre = "Pedro";
  10.  
  11. $sector = "Competencia";
  12.  
  13. my $pru = prueba->new($nombre,$sector);
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


He estado mirando las preguntas de otras personas en el foro y he leído
lo de usar qx() o system(). He probado también la respuesta de otro usuario y se trataba de recoger el parámetro con $ARGV[0] pero me da el siguiente error:
Adjuntos
error.JPG
error.JPG (24.42 KiB) Visto 750 veces
jacks
Perlero nuevo
Perlero nuevo
 
Mensajes: 148
Registrado: 2011-04-05 11:14 @510

Re: Comparar páginas Perl

Notapor explorer » 2011-07-14 10:37 @484

El mensaje de error dice que dentro del paquete prueba no hay ningún método llamado new(), y así es. Solo hay uno llamado mostrar().
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14480
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Re: Comparar páginas Perl

Notapor jacks » 2011-07-17 09:57 @456

Hola explorer. He intentado pasarle los parámetros al init() de esta manera pero me dice lo que pone en la imagen (en este caso es la línea 34).


Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. #!c:/perl/bin
  2.  
  3. use strict;
  4. use warnings;                           # Módulos requeridos por el sistema.
  5. use utf8;                               # Este programa está escrito en codificación utf8
  6. package Marca;
  7. use Encode qw'decode';                 
  8. use base 'XML::RSS::FromHTML';
  9.  
  10.  
  11. my($nombre,$link);
  12.  
  13. $nombre = "Actualizar";
  14.  
  15. $link = "http://www.marca.com";
  16.  
  17.  
  18. &init($nombre,$link);
  19.  
  20. # Subrutina  Init:
  21.  
  22. sub init {
  23.  
  24.     my($no,$li);
  25.  
  26.     $no = $_[0];
  27.  
  28.     $li = $_[1];
  29.  
  30.     my $self = shift;
  31.  
  32.     # configuración
  33.  
  34.     $self->name($no);                                                   # Titulo del RSS.
  35.     $self->url($li);                    # Dirección de la  página web.
  36.     $self->passthru({encoding => 'iso-8859-15', encode_output => 0 });          # Condiciones de la salida
  37.  
  38. }
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4
Adjuntos
error.JPG
error.JPG (8.78 KiB) Visto 670 veces
jacks
Perlero nuevo
Perlero nuevo
 
Mensajes: 148
Registrado: 2011-04-05 11:14 @510

Re: Comparar páginas Perl

Notapor explorer » 2011-07-17 18:09 @798

Es muy complicado programar así, con el método de prueba-error... Muy difícil de que encuentres una solución.

Esto es lo que pasa:
* en la línea 18 estás llamando a una función (NO al método) llamada init() que está unas líneas más abajo, con dos argumentos, 'Actualizar' y una URL.

* en las líneas 26 y 28 pasas el contenido de los argumentos a las variables $no y $li.

* en la línea 30, estás sacando (con shift()) de la lista de argumentos pasados a init(), el primer valor (que era 'Actualizar') y lo guardas en $self. Las cosas empiezan a torcerse...

* en la línea 34, escribes $self->name($no). $self no es un objeto, sino una cadena de caracteres llamada 'Actualizar'. Le estás pidiendo a Perl que busque un paquete llamado 'Actualizar' y que ejecute un método en él llamado name(). Y como eso no existe, casca.

* las líneas 35 y 36 también fallarán si Perl no encuentra ese paquete llamado 'Actualizar'.
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14480
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Re: Comparar páginas Perl

Notapor jacks » 2011-07-18 04:51 @244

Buff, entonces con lo que me has dicho entiendo que ¿no voy a poder pasarle los links ni los nombres automáticamente? :? Menudo fallo. Entonces todo lo que he mostrado no me sirve para nada. ¿Tendría que buscar otra forma de generar RSS? ...
jacks
Perlero nuevo
Perlero nuevo
 
Mensajes: 148
Registrado: 2011-04-05 11:14 @510

Re: Comparar páginas Perl

Notapor jacks » 2011-07-18 07:59 @374

Hola, he conseguido solucionarlo pero me da un error:

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. sub setFirstName {
  2.  
  3.      my ( $self, $name ) = @_;
  4.      $self->{name} = $name if defined($name);
  5.      printf ($self->{name});
  6.      return $self->{name};
  7. }
  8.  
  9. sub setLink {
  10.  
  11.  
  12.      my ( $self, $url ) = @_;
  13.      $self->{url} = $url if defined($url);
  14.         printf ("estoy\n");
  15.         printf ("$url\n");
  16.      return $self->{url};
  17. }
  18.  
  19. sub getName{
  20.  
  21.         my $self = @_;
  22.         return $self->{name};
  23.  
  24. }
  25.  
  26. # Subrutina  Init:
  27.  
  28. sub init {
  29.  
  30.     my $self = shift;
  31.  
  32.     # configuración
  33.  
  34.     $self->passthru({encoding => 'iso-8859-15', encode_output => 0 });          # Condiciones de la salida
  35.  
  36. }
  37.  
  38. #### Programa principal:
  39.  
  40.  
  41. package main;
  42.  
  43. #use Marca;                      # No es necesario incluirle, porque está antes
  44.  
  45.  
  46. my $rss = Marca->new();          # Crear nuevo Marcar.
  47.  
  48. $rss->setFirstName('El_nombre');
  49.  
  50. $rss->setLink('la_pagina_web');
  51.  
  52. printf ($rss->getName());
  53.  
  54. $rss->update;                    # Actualizar RSS.
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


El Error:
Adjuntos
error.JPG
error.JPG (23.79 KiB) Visto 663 veces
jacks
Perlero nuevo
Perlero nuevo
 
Mensajes: 148
Registrado: 2011-04-05 11:14 @510

Re: Comparar páginas Perl

Notapor explorer » 2011-07-18 10:38 @484

Ya sé cómo pasarle argumentos a init()...

Si miramos el código fuente del módulo, tenemos esto:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. sub new {
  2.         my $self = shift;
  3.         my $p = bless({},$self);
  4.         # set default values
  5.         $p->name('myrss');
  6.         $p->cacheDir('.');
  7.         $p->feedDir('.');
  8.         $p->minInterval(300); # in seconds
  9.         $p->maxItemCount(30);
  10.         $p->passthru({});
  11.         $p->updateStatus('update not executed yet');
  12.         # initialize properties (for sub-classes)
  13.         $p->init(@_);
  14.         return $p;
  15. }
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4
Es el método que se encarga de crear el objeto XML::RSS::FromHTML. Y observa la línea 41: es ahí donde se llama al método init(). Y lo que más nos interesa: le está pasando como argumento el valor de @_, que está almacenando todos los argumentos que le hubiéramos pasado a new().

Es decir: todos los argumentos que le pasamos al método new() son pasados al método init(). Por lo tanto, podrías escribir la parte del programa algo así:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. for my $pagina (@paginas) {             # @paginas contiene toda la información de todos los enlaces a analizar
  2.     my $rss = Modulo->new($pagina->{nombre}, $pagina->{enlace});
  3.     $rss->update;
  4. }
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4
y en el Modulo, modificar el init() para que sea algo así:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. sub init {
  2.     my $self = shift;
  3.     # configuración
  4.     $self->name($_[0]);
  5.     $self->url ($_[1]);
  6. }
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4
De esta manera, ya le pasamos el nombre y la URL al módulo.

Pero... tenemos ahora otro problema... y es el método defineRSS(). A este método también le tenemos que personalizar para que podamos definir el título y descripción de todo el canal RSS. Y aquí tropezamos: no hay forma sencilla de pasarle los argumentos.

Entonces... se me ha ocurrido que podemos hacer algo 'alegal', consistente en 'ampliar' los atributos del objeto XML::RSS::FromHTML, incorporando el título y la descripción del canal.

Entonces, cambiamos una vez más la llamada a new() para que tengo dos argumentos más:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1.     my $rss = Modulo->new(
  2.         $pagina->{nombre},
  3.         $pagina->{enlace},
  4.         $pagina->{titulo},
  5.         $pagina->{descripcion},
  6.     );
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4
De esta manera, pasamos a init() todos los valores. Ahora modificamos init() dentro de Modulo:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. sub init {
  2.     my $self = shift;
  3.     # configuración
  4.     $self->name($_[0]);
  5.     $self->url ($_[1]);
  6.     $self->{titulo}      = $_[2];
  7.     $self->{descripcion} = $_[3];
  8. }
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4
Con esto, estamos creando dos nuevos atributos del objeto, e inicializándolos con los valores del canal RSS. Ahora solo queda modificar
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. sub defineRSS {
  2.     my $self = shift;
  3.     my $xmlrss  = shift;
  4.     # definiciones del RSS generado
  5.     $xmlrss->channel(
  6.         title       => $self->{titulo},
  7.         description => $self->{descripcion},
  8.     );
  9. }
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4
Y ya está: las definiciones del canal RSS las obtenemos de los atributos del objeto que guardamos antes en init().

Esto es algo 'alegal' :shock: porque no es recomendable crear/acceder a los atributos de un objeto, de esta forma tan directa.

Pero bueno... Perl es lo suficientemente flexible como para permitir hacer estas piruetas. :lol:
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14480
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

AnteriorSiguiente

Volver a Básico

¿Quién está conectado?

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