• Publicidad

Crear ejecutable de scripts en Perl para Windows

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

Re: Crear ejecutable de scripts en Perl para Windows

Notapor explorer » 2011-11-04 14:49 @659

Con el PAR, lo mismo que el perl2exe, permite que forcemos la integración de módulos que no haya podido descubrir por sí solo.

Con el pp, según veo en el manual, es con la opción -M.
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

Publicidad

Re: Crear ejecutable de scripts en Perl para Windows

Notapor jacks » 2011-11-04 19:49 @867

Hola, explorer. Yo, la verdad, no sé qué pasa con este módulo pero me está trayendo de cabeza. Solo me queda hacer funcionar este módulo pero cada vez que arreglo algo sale otro problema. El último es este y no sé qué significa:
Adjuntos
errore.JPG
errore.JPG (85.9 KiB) Visto 820 veces
jacks
Perlero nuevo
Perlero nuevo
 
Mensajes: 148
Registrado: 2011-04-05 11:14 @510

Re: Crear ejecutable de scripts en Perl para Windows

Notapor explorer » 2011-11-05 05:10 @257

Pues sí, sí que es raro...

He mirado Class/Load.pm, cerca de la línea 51, y me parece que ha fallado load_optional_class(). Lo que no sé es por qué.
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: Crear ejecutable de scripts en Perl para Windows

Notapor jacks » 2011-11-05 06:35 @316

:( ¿Por qué da tantos problemas este módulo? Ya no sé qué más hacer para que funcione. Me he quedado sin ideas. ¿Podrías probar tu en tu ordenador el compilar con PAR o perl2exe el módulo ese? A ver si a ti te da problemas...
jacks
Perlero nuevo
Perlero nuevo
 
Mensajes: 148
Registrado: 2011-04-05 11:14 @510

Re: Crear ejecutable de scripts en Perl para Windows

Notapor explorer » 2011-11-05 23:07 @004

Bueno, yo no tengo Windows :wink: , así que las condiciones serán distintas, pero lo intentaré.

Como estoy en Linux OpenSuse, para usar pp necesito antes instalar estos paquetes:
Sintáxis: [ Descargar ] [ Ocultar ]
Using bash Syntax Highlighting
  1. casa:~/ # zypper in perl-Archive-Zip perl-Getopt-ArgvFile perl-Module-ScanDeps perl-PAR perl-PAR-Dist perl-PAR-Packer
Coloreado en 0.003 segundos, usando GeSHi 1.0.8.4

Ya como usuario normal, voy al directorio donde está el programa que usa XML::RSS::FromHTML, y lo empaqueto:
Sintáxis: [ Descargar ] [ Ocultar ]
Using bash Syntax Highlighting
  1. explorer@casa:~/Documentos/Desarrollo> pp -o xml_rss_fromhtml xml_rss_fromhtml.pl
  2. # 4 minutos más tarde...
  3. explorer@casa:~/Documentos/Desarrollo> rm Marca.*; ./xml_rss_fromhtml
  4. Cannot find encoding "iso-8859-15" at XML/RSS.pm line 1368.
  5. Cannot open file ./Marca.xml for write: Argumento inválido at XML/RSS/FromHTML.pm line 334
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4

¡Vaya!, un error... :cry:

Comienza la fase de exploración:
Sintáxis: [ Descargar ] [ Ocultar ]
Using bash Syntax Highlighting
  1. explorer@casa:~/Documentos/Desarrollo> locate XML/RSS.pm
  2. /usr/lib/perl5/site_perl/5.12.1/XML/RSS.pm
  3. /usr/lib/perl5/site_perl/5.12.3/XML/RSS.pm
  4. explorer@casa:~/Documentos/Desarrollo> less /usr/lib/perl5/site_perl/5.12.3/XML/RSS.pm
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4

Mirando la línea 1368 de XML::RSS, me encuentro esto:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. sub _get_save_output_mode {
  2.     my $self = shift;
  3.  
  4.     return (">:encoding(" . $self->_untaint($self->_encoding()) . ")");
  5. }
  6.  
  7. sub save {
  8.     my ($self, $file) = @_;
  9.  
  10.     local (*OUT);
  11.  
  12.     open(OUT, $self->_get_save_output_mode(), "$file")
  13.       or croak "Cannot open file $file for write: $!";
  14.     print OUT $self->as_string;
  15.     close OUT;
  16. }
Coloreado en 0.002 segundos, usando GeSHi 1.0.8.4

Eso quiere decir que, a la hora de crear el :encoding(iso-8859-15), Perl no ha sabido encontrar esa codificación. El problema es que no se ha incluido la codificación en el programa final.

¿Y cómo se resuelve esto? Es muy posible que pp no haya incluido algún módulo o biblioteca que gestione las codificaciones.

Todo el tema de las codificaciones lo gestione la familia de módulos Encode.

Visitando la página web oficial del Perl Archiving Toolkit, yendo a la sección de preguntas frecuentes, en la sección Perl Tk tips, recomiendan poner un 'use Encode' especial al principio del programa, para que funcione bien.

Sospechas... :?

Una búsqueda por Google, por "Cannot find encoding" perl pp OR PAR, me sale una página japonesa (que Google amablemente me traduce), y en que el autor se encuentra con el mismo mensaje de error que a mi (muy útil Google, también, para localizar artículos que mencionen mensajes de error). En el artículo, pone que define una capa open() para que todo salga en japonés, pero al ejecutar el programa, le sale el mismo error que a mi. Y que había encontrado la solución, poniendo un 'use Encode::JP;'.

Se confirma la sospecha :) Hay que probar a poner un 'Encode' al principio. Pero... ¿cuál?

Como el programa lee un HTML y genera un XML en codificación ISO-8859-15, debemos buscar esa codificación.

Haciendo un locate Encode/ en la línea de comandos, salen todos los archivos del sistema que están dentro de un subdirectorio Encode/. Sacando la página de manual de alguno de ellos, al final me encuentro con este:
Sintáxis: [ Descargar ] [ Ocultar ]
Using text Syntax Highlighting
Encode::Byte(3pm)    Perl Programmers Reference Guide    Encode::Byte(3pm)



NAME
       Encode::Byte - Single Byte Encodings

SYNOPSIS
           use Encode qw/encode decode/;
           $greek = encode("iso-8859-7", $utf8);  # loads Encode::Byte implicitly
           $utf8  = decode("iso-8859-7", $greek); # ditto

ABSTRACT
       This module implements various single byte encodings.  For most cases it
uses \x80-\xff (upper half) to map non-ASCII characters.  Encodings supported are as
follows.

         Canonical      Alias                                Description
         --------------------------------------------------------------------
         # ISO 8859 series
         (iso-8859-1   is in built-in)
         iso-8859-2    latin2                                       [ISO]
         iso-8859-3    latin3                                       [ISO]
         iso-8859-4    latin4                                       [ISO]
         iso-8859-5                                                 [ISO]
         iso-8859-6                                                 [ISO]
         iso-8859-7                                                 [ISO]
         iso-8859-8                                                 [ISO]
         iso-8859-9    latin5                                       [ISO]
         iso-8859-10   latin6                                       [ISO]
         iso-8859-11
         (iso-8859-12 is nonexistent)
         iso-8859-13   latin7                                       [ISO]
         iso-8859-14   latin8                                       [ISO]
         iso-8859-15   latin9                                       [ISO]
         iso-8859-16   latin10                                      [ISO]
...
 
Coloreado en 0.000 segundos, usando GeSHi 1.0.8.4

Bueno, pues solo queda hacer la prueba.

Editamos el programa, y colocamos esta línea
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. use Encode::Byte;
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4
al principio (la metí dentro del package que hereda de XML::RSS::FromHTML, pero creo que dará lo mismo si lo pongo al principio de todo).

Vuelvo a compilar con pp, y vuelvo a ejecutar.

Esta vez, no sale ningún error, se conectó a Marca, se bajó la página, extrajo los titulares y generó el RSS. (Curiosamente, apenas han cambiado desde que hice la última prueba en junio).

¡Listo! :lol:

Obviamente, mi programa es muy sencillo comparado con el tuyo, pero a lo mejor la solución es igual de simple.
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: Crear ejecutable de scripts en Perl para Windows

Notapor jacks » 2011-11-06 13:28 @602

Hola, explorer. Mira: este es mi programa:

PRINCIPAL:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. #!C:\camelbox\bin\perl.exe
  2.  
  3. package Principal;
  4. use DBI;                    # Módulo requerido para conectar a la base de datos.
  5. use ConectarDB;             # Módulo requerido para conectar con la base de datos "abrir".
  6. use ConectarDBrss;          # Módulo requerido para conectar con la base de datos "rss".
  7. use autodie;                # Módulo requerido para finalizar programa en algunos casos.
  8. use Data::Dumper;           # Módulo para realizar algunas acciones.
  9. use File::Slurp;
  10. use Update;
  11.  
  12. sub nuevo  {
  13.    
  14.     my $self = shift;
  15.    
  16.     &comprobarDB("abrir");                                  # Llamada a subrutina CompararDB. En este caso la base de datos "abrir".
  17.  
  18.     my $conexionAB = ConectarDB->connect();                 # Establecer conexión con la base de datos.
  19.  
  20.     &comprobarDB("rss");                                    # Llamada a subrutina CompararDB. En este caso la base de datos "rss".
  21.    
  22.     my $conexionRSS = ConectarDBrss->connect();             # Establecer conexión con la base de datos.
  23.  
  24.  
  25.     my @mis_tablas = &tablas($conexionAB);                  # Hacemos una llamada a la subrutina tablas() y guardamos el resultado en el array mis_tablas.
  26.  
  27.     my  ($url, $empresa, $cont);                            # Declaración de las variables.
  28.  
  29.  
  30.     for my $tabla (@mis_tablas) {                           # Bucle para recorrer cada una de las tablas y las vamos recogiendo en la variable tabla.
  31.        
  32.        
  33.         print "Tabla: ", $tabla, "\n";
  34.        
  35.         $cont = $conexionAB->prepare("SELECT * FROM $tabla");                 # Desde la conexión a la base de datos  cogemos la información seleccionada    mediante el SELECT de la base de datos.
  36.  
  37.         $cont->execute();                                                     # Ejecutamos lo que hemos preparado en la línea anterior.
  38.        
  39.  
  40.         while (my $ref = $cont->fetchrow_hashref()) {                         # Con este bucle mientras  quede algún valor en  $ref de los que seleccionamos de la base de datos y mientras  la variable encontrado sea "0" seguirá el bucle. Cuando   uno  de los dos falle se saldrá.
  41.                
  42.  
  43.                 $url = $ref->{'link'};                                        # Dejamos en la variable url el link.
  44.                
  45.                 print $url,"\n";
  46.                
  47.                 $empresa = $ref->{'nombreEmpresa'};                           # Dejamos en la variable empresa el nombreEmpresa.
  48.                
  49.                 print $empresa,"\n";
  50.                
  51.                 &actualizar($empresa, $conexionRSS, $url);                    # Hacemos una llamada a la suburtina actualizar pasandole el nombreEmpresa, la conexión y el link.
  52.  
  53.  
  54.  
  55.                 &crearTabla($empresa, $conexionRSS);                          # Hacemos una llamada a la suburtina crearTabla pasándole el nombreEmpresa y la conexión.
  56.  
  57.                
  58.                 my $pal= join(".",$empresa,"cache");                          # Juntamos el nombreEmpresa con la palabra cache para poder leer el archivo generado, y dejamos el resultado en la variable pal.
  59.                                                # Leemos el archivo con el nombre de la variable pal y lo dejamos en la variable archivo.
  60.  
  61.                 my $copia_archivo = &comprobarArchivo($pal);                            # Con eval comprobamos que el archivo contiene algo y si es así se lo pasamos a copia_archivo.
  62.                                
  63.                 my($link,$title,$description,$date);                                # Declaramos las variables.
  64.                
  65.                 if ($copia_archivo){                                          # Un if para comprobar que copia_archivo tiene algo y si es así...
  66.  
  67.                     for my $entrada (@{$copia_archivo}) {                     # ... hacemos un bucle recorriendo copia_archivo y vamos dejando cada parte en la variable entrada.
  68.                    
  69.                
  70.                             $link = $entrada->{Link};                         # Dejamos en la variable link el Link.
  71.                             print $entrada->{Link}, "\n";
  72.                
  73.                             $title  = $entrada->{title};                      # Dejamos en la variable title el título.
  74.                             print $entrada->{title}, "\n";
  75.                
  76.                             $description = $entrada->{description};           # Dejamos en la variable description la descripción.
  77.                             print $entrada->{description}, "\n";
  78.                            
  79.                             $date = $entrada->{fecha};
  80.                             print $entrada->{fecha}, "\n";
  81.                        
  82.                             if (&comparar($conexionRSS,$empresa,$title)==0){
  83.                        
  84.                                 &insertar($link,$empresa,$conexionRSS,$title,$description,$date);     # Hacemos una llamada a la subrutina insertar pasándole el link, el nombreEmpresa, la conexión, el título y la descripción.
  85.                
  86.                             }
  87.                
  88.                     }
  89.                 }  
  90.                
  91.         }
  92.        
  93.         $cont->finish();               # Finalizar el select.
  94.  
  95.     }
  96.                
  97.     $conexionAB->disconnect;               # Finalizar conexión a la base de datos "abrir".
  98.  
  99.     $conexionRSS->disconnect;              # Finalizar conexión a la base de datos "rss".
  100. }
  101.  
  102. # Subrutina actualizar.
  103.  
  104. sub actualizar{
  105.    
  106.     print "Actualizar\n";
  107.    
  108.     my ($empresa, $conexion, $url)= @_;                         # Recoge los datos pasados desde la  llamada en estas variables.
  109.    
  110.     my $titulo = "Fuente de noticias";                          # Título.
  111.  
  112.     my $descripcion = "Titulares de las actualizaciones";       # Descripción.
  113.  
  114.     my $rss = Update->new($empresa,$url,$titulo,$descripcion);  # Pasamos los parámetros requeridos al programa Update.pm
  115.    
  116.     eval {$rss->update};                                        # Se actualiza con los parámetros que le hemos pasado.
  117.                      
  118. }
  119. # Subrutina insertar.
  120.  
  121. sub insertar {
  122.    
  123.         printf("estoy  en insert\n");
  124.        
  125.         my ( $link, $tabla, $conexion, $titulo , $descripcion,$fech) = @_;                                       # Recoge los datos pasados desde la  llamada en estas variables.          
  126.        
  127.         printf ("$link\n");
  128.         print "\n";
  129.         print "\n";
  130.  
  131.         my  $sth = $conexion->prepare("INSERT INTO $tabla(link,titulo,descripcion,fecha) VALUES (?,?,?,?)") or die("Couldn't prepare statement: " . $conexion->errstr);    # Desde la conexión a la base de datos  insertamos en la  tabla, cuyo nombre le pasamos desde la llamada  a la subrutina en la  posición tercera, la información que después le proporcionamos. Si no existe la tabla  sale con la  función "die".
  132.  
  133.         $sth->execute($link,$titulo,$descripcion,$fech) or die("Couldn't execute statement: " . $sth->errstr);    # Se procesa la orden ejecutar insertando los valores pasados en la llamada a la subrutina en las posiciones primera y segunda. Si no se puede insertar sale con la  función "die".
  134.  
  135.         $sth->finish;                                                                                       # Finalizamos la  operación.
  136. }
  137.  
  138. # Subrutina comprobarDB.
  139.  
  140. sub comprobarDB {
  141.  
  142.         my $db = $_[0];                                                                                            # Recoge los datos pasados desde la  llamada en estas variables.
  143.        
  144.         my @databases = DBI->data_sources("mysql", {host => 'localhost', user => 'root', password => 'jarama'});   # Cogemos la lista de bases de datos presentes en el sistema.
  145.  
  146.         my $base_datos = $db;                               #Introducimos el nombre de la  base de datos que queremos comprobar que está  en la variable $base_datos.
  147.  
  148.         my $dsn = "DBI:mysql:$base_datos";                  # Conformamos el DSN de esa base de datos.
  149.  
  150.         unless ($dsn ~~ @databases) {                       # Si el $dsn no está entre las @databases la creamos.
  151.  
  152.                 my $drh = DBI->install_driver("mysql");     # Carga del controlador mysql
  153.  
  154.                 my $rc = $drh->func("createdb", $base_datos, 'localhost', 'root', 'jarama', 'admin');               # Creamos la base de datos.
  155.         }
  156.        
  157. }
  158. # Subrutina crearTabla.
  159.  
  160. sub  crearTabla {
  161.    
  162.     print "Estoy en crear tabla\n";
  163.    
  164.     print "\n";
  165.     print "\n";
  166.    
  167.    
  168.     my ($tabla, $conexion) = @_;                                                # Recoge los datos pasados desde la  llamada en estas variables.
  169.  
  170.     eval  {$conexion->do("CREATE TABLE $tabla (link VARCHAR(500), titulo VARCHAR(600), descripcion VARCHAR(1000), fecha VARCHAR(100), comentario VARCHAR(1000))")};     #Hacemos un eval, cuya función será dejar que la tabla   se cree o no dependiendo de si existe,y desde la conexión a la  base de datos hacemos  crearemos la tabla  si  no existe  ya.
  171.  
  172.     if ($@) {
  173.  
  174.         printf("La tabla existe \n")                                            # Se captura el error si la tabla existe y nos dice que "La  tabla  existe".
  175.  
  176.     }
  177.  
  178. }
  179.  
  180. # Subrutina tablas.
  181.  
  182. sub tablas {
  183.    
  184.     my ($conexion, $tabla);                         # Declaramos las variables  a utilizar.
  185.    
  186.     $conexion = $_[0];                              # Recogemos la  conexión en esta variable.
  187.  
  188.     my $sth = $conexion->prepare("show tables")or die("Couldn't prepare statement: " . $conexion->errstr); # Cogemos los nombres de las tablas de la base de datos que le hemos pasado en la conexión.
  189.  
  190.     $sth->execute() or die("Couldn't execute statement: " . $sth->errstr);                                 # Ejecutamos la  acción.
  191.    
  192.     my @tables;                                     # Declaración del array en el cual introduciremos cada uno de los nombres de las tablas que hemos seleccionado.
  193.  
  194.     while (my $row = $sth->fetchrow_arrayref) {     # Recorremos con un while() hasta que se acaben los datos que hemos recogido de la base de datos.
  195.    
  196.         $tabla = join("\t", @$row);                 # En la variable tabla dejamos el nombre de cada una de las tablas recogidas.
  197.        
  198.         push @tables ,$tabla;                       # Insertamos cada tabla en el  array tables.
  199.        
  200.         print ("$tabla\n");
  201.    
  202.     }
  203.    
  204.     return @tables;                                 # Devolvemos el array con las tablas.
  205. }
  206. sub comparar{
  207.  
  208.  
  209.       my($conexion,$tabla,$title)=@_;                         #Variables que usaremos para recoger los parámetros de entrada  desde la llamada  a la subrutina.
  210.  
  211.       print "Estoy en comparar y el titulo es: ",$title,"\n";
  212.      
  213.       print "La tabla es: \n";
  214.  
  215.       my $sth = $conexion->prepare("SELECT * FROM $tabla");       #desde la conexión a la base de datos  cogemos la informacion seleccionada   , mediante el SELECT ,de la base de datos.
  216.  
  217.       $sth->execute();                                   # Ejecutamos lo que hemos preparado en la línea anterior.
  218.  
  219.       my $encontrada= 0;                                    # Usamos una variable para  salir del bucle cuando encontremos lo que buscamos.
  220.  
  221.  
  222.         while (my $ref = $sth->fetchrow_hashref() and  $encontrada==0) {   # Con este bucle mientras  quede algún valor en  $ref de los que seleccionamos de la base de datos y mientras  la variable encontrado sea "0" seguirá el bucle. Cuando   uno  de los dos falle se saldrá.
  223.  
  224.                 if  ( $title eq $ref->{'titulo'}){       #Comparamos la  primera  variable que le pasamos desde la  llamada a la subrutina  con el correo cogido desde la base de datos.  Si son iguales  quiere decir que el correo existe con lo cual ponemos la  variable encontrado a "1" y salimos del bucle.
  225.                     print $ref->{'titulo'},"\n";
  226.                     print $title,"\n";
  227.  
  228.                       $encontrada = 1;
  229.                 }
  230.         }
  231.  
  232.         $sth->finish();
  233.  
  234.         return $encontrada;                              # Devuelve el valor de encontrado.
  235. }
  236.  
  237. sub comprobarArchivo {
  238.    
  239.         my  $tipo=$_[0];
  240.        
  241.         print "El archivo se llama: ",$tipo,"\n";
  242.        
  243.         my $fich;
  244.        
  245.         if (-e $tipo){
  246.            
  247.             my $archivo = read_file($tipo);                                # Leemos el archivo con el nombre de la variable pal y lo dejamos en la variable archivo.
  248.             $fich = eval $archivo;
  249.            
  250.         }      
  251.         return $fich;    
  252. }
  253.  
  254. 1;
Coloreado en 0.005 segundos, usando GeSHi 1.0.8.4



UPDATE:

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. #!C:\camelbox\bin\perl.exe
  2.  
  3.  
  4. #use strict;
  5.  
  6. use warnings;                           # Módulos requeridos por el sistema.
  7.  
  8. use utf8;                               # Este programa está escrito en codificación utf8
  9.  
  10. package Update;
  11.  
  12. use Encode qw'decode';
  13.                        
  14. use base 'XML::RSS::FromHTML';
  15.  
  16.  
  17. # Subrutina  Init:
  18.  
  19. sub init {
  20.  
  21.     my $self = shift;
  22.  
  23.     # configuración
  24.  
  25.     $self->name($_[0]);                                                         # Nombre de la empresa que le pasamos desde el programa main.
  26.     $self->url($_[1]);                                                          # Dirección de la  página web que le pasamos desde el programa main..
  27.     $self->{titulo}      = $_[2];                                               # Titulo de los RSS que le pasamos desde el programa main.
  28.     $self->{descripcion} = $_[3];                                               # Descripción de los RSS que le pasamos desde el programa main.
  29.     $self->passthru({encoding => 'iso-8859-15', encode_output => 0 });          # Condiciones de la salida
  30.  
  31. }
  32.  
  33.  
  34. # Subrutina  DefinirRSS:
  35.  
  36. sub defineRSS {
  37.  
  38.     my $self = shift;
  39.     my $xmlrss  = shift;
  40.  
  41.     # Definiciones del RSS generado:
  42.  
  43.     $xmlrss->channel(                                                                  
  44.  
  45.         title       => $self->{titulo},                 # Título de los RSS que hemos generado en la  sub init.
  46.         description => $self->{descripcion},            # Descripción de lo que hemos buscado que hemos generado en la sub init.
  47.     );
  48. }
  49.  
  50. # Subrutina CrearListaDeElementos:
  51.  
  52. sub makeItemList {
  53.  
  54.     my $self = shift;
  55.     my $html = shift;
  56.  
  57.     # Interpretamos el código HTML y crear con ello una lista:
  58.  
  59.     my @list;
  60.  
  61.      # $html = decode('iso-8859-15', $html);                                            # Codificación ha 'iso-8859-15'.
  62.      
  63.      
  64.       while ($html =~ m{<div id="subnavigation">.+?<h2><span>(.+?)</span></h2>.+?<p class="preamble">(.+?)</p>}smg) {
  65.  
  66.         # print "[$1][$2][$3]\n";                                                       # Imprimir por  pantalla lo que hemos encontrao.
  67.  
  68.         push(@list,{                                                                    # La lista de los elementos (Título, Link, Descripcion).
  69.  
  70.             Link        => "",
  71.             title       => $1,
  72.             description => $2,
  73.             fecha => $self->getDateTime(),
  74.         });
  75.    
  76.     }
  77.  
  78.       while ($html =~ m{<div>.+?<p class="date">(.+?)</p>.+?<h4><a href="(.+?)">(.+?)</a></h4>}smg){            # Patrón por el que buscaremos las notícias.
  79.  
  80.         # print "[$1][$2][$3]\n";                                                       # Imprimir por  pantalla lo que hemos encontrado.
  81.  
  82.         push(@list,{                                                                    # La lista de los elementos (Título, Link, Descripción).
  83.  
  84.             Link        => $2,
  85.             title       => $1,
  86.             description => $3,
  87.  
  88.             fecha => $self->getDateTime(),
  89.         });
  90.    
  91.     }
  92.  
  93.  
  94.     while ($html =~ m{</div><div class=".+?"><h3 class="">(.+?)</h3>.+?<p class="read-more">.+?<a href="(.+?)"><span>(.+?)</span></a>}smg){             # Patrón por el que buscaremos las notícias.
  95.  
  96.         # print "[$1][$2][$3]\n";                                                       # Imprimir por  pantalla lo que hemos encontrado.
  97.  
  98.         push(@list,{                                                                    # La lista de los elementos (Título, Link, Descripcion).
  99.  
  100.             Link        => $2,
  101.             title       => $1,
  102.             description => $3,
  103.             fecha => $self->getDateTime(),
  104.         });
  105.    
  106.     }
  107.  
  108.  
  109.     while ($html =~ m{<div class="clearer"></div>.+?<div id="content">.+?<h2>(.+?)</h2>.+?<p class="preamble">(.+?)</p>}smg){           # Patrón por el que buscaremos las notícias.
  110.  
  111.         # print "[$1][$2][$3]\n";                                                       # Imprimir por  pantalla lo que hemos encontrado.
  112.  
  113.         push(@list,{                                                                    # La lista de los elementos (Título, Link, Descripcion).
  114.  
  115.             Link        => "",
  116.             title       => $1,
  117.             description => $2,
  118.             fecha => $self->getDateTime(),
  119.  
  120.         });
  121.    
  122.     }
  123.  
  124.     while ($html =~ m{<img src="/Global/Quote_26x21.gif" alt="" class="image-align-left" />.+?<p>(.+?)</p>}smg){                # Patrón por el que buscaremos las notícias.
  125.  
  126.         # print "[$1][$2][$3]\n";                                                       # Imprimir por  pantalla lo que hemos encontrado.
  127.  
  128.         push(@list,{                                                                    # La lista de los elementos (Título, Link, Descripcion).
  129.  
  130.             Link        => "",
  131.             title       => "",
  132.             description => $1,
  133.             fecha => $self->getDateTime(),
  134.         });
  135.    
  136.     }
  137.  
  138.     return \@list;                                                                      # Devuelve la lista que hemos generado.
  139.  
  140. }                                                                       # Devuelve la lista que hemos generado.
  141.  
  142.  
  143. # Subrutina AñadirNuevoElemento:
  144.  
  145. sub addNewItem {
  146.  
  147.     my $self = shift;
  148.     my ($xmlrss,$eachItem) = @_;
  149.  
  150.     # Crear cada elemento del RSS usando el método XML::RSS->add_item
  151.  
  152.     $xmlrss->add_item(
  153.             link        => $eachItem->{link       },
  154.             title       => $eachItem->{title      },
  155.             description => $eachItem->{description},
  156.     );
  157.  
  158. }
  159.  
  160. 1;
  161.  
  162.  
Coloreado en 0.003 segundos, usando GeSHi 1.0.8.4



Lo que hace el programa Principal es cargar de la base de datos Abrir los nombres y las urls de las empresas. Con un bucle se los vamos pasando y el programa Update va generando los .cache. El programa principal lee esos archivos y guarda en la base de datos rss las noticias generadas.

EDITADO:

¿Se podría, aunque sea, crear el ejecutable en Linux y que se pueda ejecutar en Windows? Porque creo que perl2exe tiene una opción para eso. Lo que tengo mis dudas es aunque se pudiera , ¿existen en Linux los módulos para Win32::GUI?
jacks
Perlero nuevo
Perlero nuevo
 
Mensajes: 148
Registrado: 2011-04-05 11:14 @510

Re: Crear ejecutable de scripts en Perl para Windows

Notapor jacks » 2011-11-07 09:33 @440

El problema que me daba , que comentaste en un post de la página anterior, Class::Load, ¿no puede ser que en la línea 51 dé error el módulo Crap? Porque hace uso de Crap::croak y pues no lo encuentro por ningún lado.

Este es el codigo donde falla la linea 51. Nose si sera como el tuyo:

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. package Class::Load;
  2. {
  3.   $Class::Load::VERSION = '0.12';
  4. }
  5. use strict;
  6. use warnings;
  7. use base 'Exporter';
  8. use Data::OptList 'mkopt';
  9. use Module::Runtime qw(check_module_name module_notional_filename
  10.                        require_module use_module);
  11. use Package::Stash;
  12. use Try::Tiny;
  13.  
  14. our $IMPLEMENTATION;
  15.  
  16. BEGIN {
  17.     $IMPLEMENTATION = $ENV{CLASS_LOAD_IMPLEMENTATION}
  18.         if exists $ENV{CLASS_LOAD_IMPLEMENTATION};
  19.  
  20.     my $err;
  21.     if ($IMPLEMENTATION) {
  22.         if (!try { require_module("Class::Load::$IMPLEMENTATION") }) {
  23.             require Carp;
  24.             Carp::croak("Could not load Class::Load::$IMPLEMENTATION: $@");
  25.         }
  26.     }
  27.     else {
  28.         for my $impl ('XS', 'PP') {
  29.             if (try { require_module("Class::Load::$impl") }) {
  30.                 $IMPLEMENTATION = $impl;
  31.                 last;
  32.             }
  33.             else {
  34.                 $err .= $@;
  35.             }
  36.         }
  37.     }
  38.  
  39.     if (!$IMPLEMENTATION) {
  40.         require Carp;
  41.         Carp::croak("Could not find a suitable Class::Load implementation: $err");
  42.     }
  43.  
  44.     my $impl = "Class::Load::$IMPLEMENTATION";
  45.     my $stash = Package::Stash->new(__PACKAGE__);
  46.     $stash->add_symbol('&is_class_loaded' => $impl->can('is_class_loaded'));
  47.  
  48.     sub _implementation {
  49.         return $IMPLEMENTATION;
  50.     }
  51. }
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4
Última edición por jacks el 2011-11-07 11:02 @501, editado 1 vez en total
jacks
Perlero nuevo
Perlero nuevo
 
Mensajes: 148
Registrado: 2011-04-05 11:14 @510

Re: Crear ejecutable de scripts en Perl para Windows

Notapor explorer » 2011-11-07 10:12 @466

jacks escribiste:¿existen en Linux los módulos para Win32::GUI?
Me temo que no.
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: Crear ejecutable de scripts en Perl para Windows

Notapor explorer » 2011-11-07 10:17 @470

jacks escribiste:¿no puede ser que en la línea 51 dé error el módulo Crap? Porque hace uso de Crap::croak y pues no lo encuentro por ningún lado.
croak() es una función que está definida dentro del módulo Carp (no Crap).
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: Crear ejecutable de scripts en Perl para Windows

Notapor jacks » 2011-11-07 11:04 @503

Entonces no se te ocurre ninguna posible solución, ¿no? Es que ando poniendo en diferentes sitios para ver si alguien me ayuda pero parece ser que nadie sabe por qué. Con "pp -c -e" me ha generado una lista de las dependencias pero vamos, lo único que se me ocurre es incluir todos los módulos con "use modulo" en el script. No se qué hacer :?
jacks
Perlero nuevo
Perlero nuevo
 
Mensajes: 148
Registrado: 2011-04-05 11:14 @510

AnteriorSiguiente

Volver a Básico

¿Quién está conectado?

Usuarios navegando por este Foro: No hay usuarios registrados visitando el Foro y 1 invitado

cron