• Publicidad

Problema con diferentes distribuciones

¿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 diferentes distribuciones

Notapor davidferrero » 2009-09-02 03:36 @192

Buenas tengo un pequeño proyecto entre manos en Perl, y lógicamente, la idea es poder instalarlo en diferentes sistemas Linux.

No quiero sugerir ni por asomo que tengo problemas de compatibilidad con Perl, esa duda se dejo aclarada en otro tema.

El caso es que en mi instalación de Debian no tengo problemas, o eso creo, en la ejecución de mi programa, mientras que al meterme en Red Hat resulta que salta un error. La curiosidad es que aparentemente no es error de librería o eso creo; el error sería:
Can`t use an undefined value as a HASH reference at ...

Esto en Debian ni aparece y la función sobre la que da el error, aparentemente, funciona sin problemas. En Ubuntu he probado también y da otro error, que no es tan importante ahora y que espero a través de éste poder solucionarlo.

¿Alguien sabría decirme el porqué de esto? En Red Hat la versión de Perl es la v5.8.8 mientras que en Debian seria la v5.10.

Añado el código, ésta sería la función:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. sub config{
  2. my $self->{_config}=new PerlMonitorServer::Config();
  3. return $self->{_config};
  4. }
Coloreado en 0.002 segundos, usando GeSHi 1.0.8.4


El código de new() sería:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. sub new {
  2.   my $pkg = shift;
  3.   my %hash = (_permitted => {}, _scope => 'server');
  4.   my $ref = \%hash;
  5.   bless $ref, $pkg;
  6. #  logDebug(caller(). " creating new Config object=$ref.");
  7.   my %args = @_;
  8.   $write_flag = 1  if (defined $args{'write'});
  9.   $ref->load_config();
  10.   $ref->load_mime_types()  unless ($mime_types_loaded);
  11.   return $ref;
  12. }
Coloreado en 0.002 segundos, usando GeSHi 1.0.8.4


Creo que en este trozo estaría el error, no creí necesario introducirlo porque en Debian no de da errores, otra cosa es que fuera como he dicho debido a la versión
Última edición por explorer el 2009-09-04 19:03 @835, editado 2 veces en total
Razón: Acentos
davidferrero
Perlero nuevo
Perlero nuevo
 
Mensajes: 25
Registrado: 2009-07-29 03:12 @175

Publicidad

Re: Problema con diferentes distribuciones

Notapor explorer » 2009-09-02 03:44 @197

El error dice que no se puede usar un valor no definido como una referencia a un hash, porque... (no se sabe porque no se ve el código :) )
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: Problema con diferentes distribuciones

Notapor davidferrero » 2009-09-02 04:38 @235

El caso es que en teoría el código no tendría nada que ver, ¿no? sino, ¿por qué funciona en Debian y no en Red Hat? Otra cosa es que por defecto se encuentren librerías instaladas que interpretan el código de otra manera, o que al ser versiones diferentes lo que una versión acepta como código valido digamos la otra no.

El motivo sería lógico, mi inexperiencia a la hora de programar en Perl.
Última edición por explorer el 2009-09-02 04:46 @240, editado 1 vez en total
Razón: Ortografía
davidferrero
Perlero nuevo
Perlero nuevo
 
Mensajes: 25
Registrado: 2009-07-29 03:12 @175

Re: Problema con diferentes distribuciones

Notapor explorer » 2009-09-02 04:50 @243

Yo creo que la principal razón es la diferencia de versiones del intérprete. Tendrás que repasar el perldelta5100 para saber si hay algún detalle que se te ha pasado.

No podemos ayudarte más, sin ver el código. Otro consejo es siempre usar
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
use strict;
use warnings;
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4
durante la fase de desarrollo, para cazar ese tipo de errores.
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: Problema con diferentes distribuciones

Notapor davidferrero » 2009-09-02 05:13 @259

Mira, el código de ese config sería:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. package PerlMonitorServer::Config;
  2.  
  3. use strict;
  4. use Exporter;
  5. use Cwd;
  6. use Config;
  7. use PerlMonitorServer::Logs;
  8. use vars qw(@ISA @EXPORT $AUTOLOAD $write_flag);
  9. use PerlMonitorServer::Misc;
  10. use Data::Dumper;
  11.  
  12. @ISA = ('Exporter');
  13. $write_flag = 0;
  14.  
  15. my $basedir = $0;
  16. $basedir =~ s/(pws\.pl|web_server\.pl|html\/gestion_formulario\.cgi|html\/gestion_formulario_mantenimiento\.cgi)//;
  17.  
  18. my $conf_file = "websrvr.cfg";
  19. my $mime_file = "mime.types";
  20.  
  21.  
  22. # Define los mime-types por defecto.  Estos pueden ser también definidos en el fichero $mime_file.
  23. my %mime = qw(js            application/x-javascript
  24.               gz            application/x-gzip
  25.               zip           application/zip
  26.               bin           application/octet-stream   
  27.               dms           application/octet-stream   
  28.               lha           application/octet-stream   
  29.               lzh           application/octet-stream   
  30.               exe           application/octet-stream   
  31.               class         application/octet-stream   
  32.               mpga          audio/mpeg                 
  33.               mp2           audio/mpeg                 
  34.               mp3           audio/mpeg                 
  35.               aif           audio/x-aiff                       
  36.               aiff          audio/x-aiff                       
  37.               aifc          audio/x-aiff                       
  38.               ram           audio/x-pn-realaudio               
  39.               rm            audio/x-pn-realaudio               
  40.               ra            audio/x-realaudio          
  41.               wav           audio/x-wav                
  42.               bmp           image/bmp                  
  43.               gif           image/gif                  
  44.               jpeg          image/jpeg                 
  45.               jpg           image/jpeg                 
  46.               jpe           image/jpeg                 
  47.               png           image/png                  
  48.               css           text/css                   
  49.               html          text/html                  
  50.               htm           text/html                  
  51.               asc           text/plain                 
  52.               txt           text/plain                 
  53.               rtf           text/rtf
  54.               qt            video/quicktime                    
  55.               mov           video/quicktime                    
  56.               avi           video/x-msvideo                    
  57.              );
  58.  
  59. my %_scope_hash;
  60. my $_default_host = '';
  61. my %_handlers;
  62. my %_handler_ext;
  63. my $modules_loaded = 0;
  64. my $mime_types_loaded = 0;
  65. $Global::CONFIG_LOADED = 1;
  66.  
  67.  
  68. sub new {
  69.   my $pkg = shift;
  70.   my %hash = (_permitted => {}, _scope => 'server');
  71.   my $ref = \%hash;
  72.   bless $ref, $pkg;
  73. #  logDebug(caller(). " creating new Config object=$ref.");
  74.   my %args = @_;
  75.   $write_flag = 1  if (defined $args{'write'});
  76.   $ref->load_config();
  77.   $ref->load_mime_types()  unless ($mime_types_loaded);
  78.   return $ref;
  79. }
  80.  
  81. sub load_config {
  82.   my $self = shift;
  83.   local (*IN);
  84.   my $dir = $basedir;
  85.   my $file_name = ($dir) ? $dir.$SEP.$conf_file : $conf_file;
  86.   if (-f $file_name && -r $file_name) {
  87.       if (open(IN,$file_name)) {
  88.           while (my $line = <IN>) {
  89.               $line =~ s/^\s//o;
  90.               $line =~ s/#.*$//o;
  91.               $line =~ s/\s+$//o;
  92.               next  unless ($line);
  93.               while ($line =~ /__\w+__/o) {
  94.                   $line =~ s/__(\w+)__/$self->$1()/e || die "Error in config file:\nUnknown value at line ". $. .": $line\n";
  95.               }
  96.               if ($line =~ /^<Scope\s+([^>]+)>$/io) {
  97.                   $self->scope($1);
  98.               } elsif ($line =~ /^<\/Scope>$/io) {
  99.                   $self->scope('server');
  100.               } elsif ($line =~ /^(\w+)\s+(.*)$/o) {
  101.                   my ($key,$val) = ($1,$2);
  102.                   if ($val =~ /\s/o) {
  103.                       $self->add_attribute($key, [split(/\s+/, $val)]);
  104.                   } else {
  105.                       $self->add_attribute($key, $val);
  106.                   }
  107.               } else {
  108.                   die "Error in config file:\nUnknown syntax at line ". $. .": $line\n";
  109.               }
  110.           }
  111.           $modules_loaded = 1;
  112.           close(IN);
  113.       } else {
  114.           die "Can't open config file: $file_name $!\n";
  115.       }
  116.   } else {
  117.       die "Can't open config file: $file_name $!\n";
  118.   }
  119. }
  120.  
  121. sub reload_config {
  122.     my $self = shift;
  123.     $modules_loaded = 0;
  124.     $mime_types_loaded = 0;
  125.     $self->load_config();
  126.     $self->load_mime_types();
  127. }
  128.  
  129. sub scope {
  130.     my ($self) = shift;
  131.     $_default_host ||= $self->{_scope}  if ($self->{_scope} ne 'server');
  132.     return (@_) ? $self->{_scope} = lc(shift) : $self->{_scope};
  133. }
  134.  
  135. sub has_scope {
  136.     my ($self,$scope) = @_;
  137.     return 0  unless ($scope);
  138.     return (defined $_scope_hash{$scope}) ? $scope : 0;
  139. }
  140.  
  141. sub default_host {
  142.     my $self = shift;
  143.     return $_default_host || 'server';
  144. }
  145.  
  146. sub add_attribute {
  147.   my ($self,$key,$val) = @_;
  148.   return  unless (defined $key);
  149.   $key = lc $key;
  150.   if ($key eq 'addmodule' and (! $modules_loaded)) {
  151.       $self->add_module($val);
  152.   } elsif ($key eq 'addtype' and (! $modules_loaded)) {
  153.       my $tmp = shift(@$val);
  154.       $self->handler_type($val,$tmp);
  155.   } else {
  156.     $self->{_permitted}{$self->scope}{$key} = 1;
  157.     $_scope_hash{$self->scope}{$key} = $val;
  158. #    print caller() . ":add_attribute: scope=". $self->scope ." $key=". $_scope_hash{$self->scope}{$key} ."\n";
  159.     if ($self->scope eq 'server') {
  160.         no strict 'refs';
  161.         ${"Global::". uc $key} = $val;
  162.     }
  163.   }
  164. }
  165.  
  166. sub add_module {
  167.     my $self = shift;
  168.     my $mod = shift or return;
  169. #    print "add_module: $mod\n";
  170.     my $obj;
  171.     my $code = qq{
  172.         require PerlMonitorServer::Module::$mod;
  173.         \$obj = new PerlMonitorServer::Module::$mod();
  174.     };
  175.     eval $code;
  176.     if ($@) {
  177.         logError("Error loading module: $mod $@");
  178.         return;
  179.     }
  180. #    print "Loaded module: $mod\n";
  181.     if ($obj->init() == M_OK) {
  182.         $self->handler($obj->handler_type,$obj);
  183.     }
  184. }
  185.  
  186. sub handler {
  187.     my ($self,$type,$obj) = @_;
  188. #    print "Called handler: type=$type\n";
  189. #    print "Handlers:\n";
  190. #    print Dumper(\%_handlers) ."\n";
  191.     return (defined $obj) ? $_handlers{$self->scope}{$type} = $obj :
  192.         $_handlers{$self->scope}{$type} || undef;
  193. }
  194.  
  195. sub handler_type {
  196.     my $self = shift;
  197.     my $ext = shift;
  198.     if (my $new_type = shift()) {
  199.         foreach (@$ext) {
  200.             $_handler_ext{$self->scope}{$_} = $new_type;
  201.         }
  202.     }
  203.     return $_handler_ext{$self->scope}{$ext} || 'text';
  204. }
  205.  
  206. sub load_mime_types {
  207.   my $self = shift;
  208.   foreach my $dir (cwd(),$self->ServerRoot) {
  209.     if (-f $dir.$SEP.$mime_file) {
  210.       $mime_file = $dir.$SEP.$mime_file;
  211.       last;
  212.     }
  213.   }
  214.  
  215.   local (*IN);
  216.   if (open(IN,$mime_file)) {
  217.     while (my $line = <IN>) {
  218.       chomp($line);
  219.       $line =~ s/^\s+//o;
  220.       $line =~ s/\#.*$//o;
  221.       next  unless ($line);
  222.       $line =~ s/\s+$//o;
  223.       if ($line =~ /^(\S+)\s+(.*)$/o) {
  224.         my ($key,$val) = ($1,$2);
  225.         foreach (split(/\s+/, $val)) {
  226.             next  unless (/\S/);
  227.             $mime{$_} = $key;
  228.         }
  229.       }
  230.     }
  231.     $mime_types_loaded = 1;
  232.     close(IN);
  233.   } else {
  234. #    logError("Cannot open mimie.types for mime definitions. $!");
  235.   }
  236. }
  237.  
  238. sub mime_type {
  239.   my ($self,$ext) = @_;
  240.   $ext ||= '';
  241.   $ext =~ s/^\.//;
  242.   return (defined $mime{$ext}) ? $mime{$ext} : 'text/html';
  243. }
  244.  
  245. sub AUTOLOAD {
  246.     my $self = shift;
  247.     my $call = $AUTOLOAD;
  248.     $call =~ s/^.*:://;
  249.     $call = lc $call;
  250.     my $tmp_scope = $self->scope;
  251.     $tmp_scope = 'server'  unless (defined $self->{'_permitted'}{$tmp_scope}{$call});
  252.     if (defined $self->{'_permitted'}{$tmp_scope}{$call}) {
  253.       if ($write_flag && @_) {
  254.         my @tmp = @_;
  255.         $_scope_hash{$tmp_scope}{$call} = (@tmp > 1) ? \@tmp : $tmp[0];
  256.       }
  257.       my @arr = (ref $_scope_hash{$tmp_scope}{$call}) ? @{$_scope_hash{$tmp_scope}{$call}} : ($_scope_hash{$tmp_scope}{$call});
  258.       return (wantarray) ? @arr : $arr[0];
  259.     } else {
  260.         my $err = "Config: scope=". $self->scope ."\n";
  261.         $err .= Dumper($_scope_hash{$self->scope}) ."\n";
  262.         $err .= "Permitted: \n";
  263.         $err .= Dumper($self->{_permitted}) ."\n";
  264.         die "Method '$call' not supported by package ", ref($self), "\n$err";
  265.     }
  266. }
  267.  
  268. sub OSTYPE {
  269.   return $Config{'osname'};
  270. }
  271.  
  272. sub is_unix {
  273.     my $self = shift;
  274.     return ($Config{'osname'} =~ /n[ui]x$/i) ? 1 : 0;
  275. }
  276.  
  277. sub DESTROY {
  278.   my $self = shift;
  279. }
  280.  
  281. ######################## FUNCIONES NUEVAS CREADAS #####################
  282.  
  283. sub config {
  284.  
  285. my $self->{_config} = new PerlMonitorServer::Config();
  286.  
  287. return $self->{_config};
  288.  
  289. } # config
  290.  
  291.  
  292. sub getIP{
  293. my $self = config;
  294. return $self->serverip;
  295. }
  296.  
  297. sub setIP($$){
  298. my $self= config;
  299. $self->serverip = shift;
  300. }
  301.  
  302. sub getPort{
  303. my $self = config;
  304. return $self->serverport;
  305. }
  306.  
  307. sub getMonitoringServices{
  308. my $self = config;
  309. print "La tarea es ".$self->servertask."\n";
  310. return $self->servertask;
  311. }
  312.  
  313. sub getInstalationDirectory{
  314. my $self = config;
  315. return $self->serverroot;
  316. }
  317.  
  318. 1;
Coloreado en 0.008 segundos, usando GeSHi 1.0.8.4


en cuanto a los pragmas utilizo el strict; y el warnings lo quité, pero volveré a ponerlo a ver qué detecta; además, en alguno también puse diagnostics para que me explicara un poquillo más, que no controlo demasiado.

Miraré eso a ver, y si alguien ve el código y me dice a qué se puede deber se lo agradecería.
Última edición por explorer el 2009-09-02 08:01 @375, editado 1 vez en total
Razón: Ortografía
davidferrero
Perlero nuevo
Perlero nuevo
 
Mensajes: 25
Registrado: 2009-07-29 03:12 @175

Re: Problema con diferentes distribuciones

Notapor explorer » 2009-09-02 08:02 @376

¿En qué línea da el error?
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: Problema con diferentes distribuciones

Notapor davidferrero » 2009-09-03 01:14 @093

El error salta en la 285
davidferrero
Perlero nuevo
Perlero nuevo
 
Mensajes: 25
Registrado: 2009-07-29 03:12 @175

Re: Problema con diferentes distribuciones

Notapor explorer » 2009-09-03 03:43 @196

Cambia la línea 285

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. my $self->{_config} = new PerlMonitorServer::Config();
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4

por

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. my $self = { _config => new PerlMonitorServer::Config() };
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


De esta manera inicializamos correctamente el valor de $self.

De la primera forma, Perl se da cuenta de que $self no tiene valor y le estamos pidiendo que lo use para referirnos a un hash anónimo con una clave llamada '_config'. Por eso salta el error. De la segunda forma, estamos definiendo exactamente cómo es $self: una referencia a un hash anónimo, con una clave que tiene un valor.
Última edición por explorer el 2009-09-03 05:49 @284, editado 1 vez en total
Razón: Typo
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: Problema con diferentes distribuciones

Notapor davidferrero » 2009-09-03 04:19 @221

Gracias por tu dedicación Explorer, el caso es que ahora me sale otro error, me dice que
Can’t modify constant item in a scalar assignment...
en la misma línea.

El caso es que introduciendo el código
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. sub config{
  2. my self = shift;
  3. unless (defined $self->{_config}
  4. require PerlMonitorServer::Config;
  5. $self->{_config}=new PerlMonitorServer::Config();
  6. } # unless
  7.  
  8. return $self->{_config};
  9. } # config
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4

consigo evitar el error, y en teoría consigo evitar el problema del interprete, aunque tengo mis dudas si eso es correcto porque ahora vuelvo a tener problemas con la definición del Server del servidor, no permitiéndome utilizar el método accept() debido a que supuestamente está sin definir.

Esto puede deberse a un error en mi código o por el intérprete. El caso es que probándolo en Ubuntu me encuentro con el mismo problema siendo también la versión v5.10 de Perl por lo que ya tengo mis dudas de que sea la distribución de Perl.

Seguramente es una pregunta sin sentido o tonta pero, ¿puede existir algún proceso que utilice lo mismo y que esté bloqueando ese método? En mi caso si ejecuto dos veces el servidor sobre el mismo puerto me ocurre esto, esto sería en Debian, pero en el resto de distribuciones Red Hat y Ubuntu me ocurre con todos los puertos por lo que no sé si algún programa ajeno a mi servidor puede hacer lo mismo.
davidferrero
Perlero nuevo
Perlero nuevo
 
Mensajes: 25
Registrado: 2009-07-29 03:12 @175

Re: Problema con diferentes distribuciones

Notapor explorer » 2009-09-03 05:50 @285

He reeditado el código, estaba mal: faltaba un '>'.

Prueba ahora.

En cuanto al bloqueo de puertos, hay una cosa que veo en el programa que no me gusta: en cada una de las funciones 'nuevas', se llama a la función config() por lo que estamos creando un nuevo objeto PerlMonitorServer::Config() en cada ocasión.

Si PerlMonitorServer::Config() se da cuenta de que es el mismo programa, debería devolver siempre el mismo objeto. Si no... podríamos estar creando objetos sin parar.

Una opción para evitarlo es como la que pones en tu nuevo código: comprobar que ya hemos creado $self para evitar crear más objetos. Para esto, lo más sencillo es poner una variable global $self (nada de my() dentro de la función) y, antes de crear el objeto, comprobar si $self está inicializada (seguro que hay otras formas mejores).

Queda claro que todo esto depende también de cómo funcione PerlMonitorServer, claro.
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

Siguiente

Volver a Básico

¿Quién está conectado?

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

cron