• Publicidad

Ayuda con función caller

¿Ya sabes lo que es una referencia? Has progresado, el nível básico es cosa del pasado y ahora estás listo para el siguiente nivel.

Ayuda con función caller

Notapor kondenado » 2009-07-31 20:09 @881

Buenas,

Antes que todo explicaré un poco lo que intento hacer. Supongamos la existencia de los siguientes ficheros:

caller.pl
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. #!/usr/bin/perl
  2. use lib qw(.);
  3. use strict;
  4. use TEST;
  5.  
  6. my $t = TEST->new();
  7. print $t->name;
  8. print "\n";
Coloreado en 0.003 segundos, usando GeSHi 1.0.8.4


TEST.pm
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. package TEST;
  2.  
  3. use vars qw($errstr $logfile)
  4.  
  5. BEGIN {
  6.     $errstr = '';
  7.     $logfile = '/tmp/test.log';
  8. }
  9.  
  10. sub new {
  11.         my $class = shift;
  12.         my $name = shift or $class->_error("falta nombre");
  13.         my $self = {};
  14.         $self->{NAME} = $name;
  15.         bless($self, $class);
  16. }
  17.  
  18. sub name {
  19.         my $self = shift;
  20.         $self->{NAME};
  21. }
  22.  
  23. sub _error {
  24.         my $self = shift;
  25.         my $error = shift;
  26.         my $file = ( caller(1) )[1];
  27.         my $line = ( caller(1) )[2];
  28.         my $sub = ( caller(1) )[3];
  29.         $errstr = "Error in $file at line $line ";
  30.         $errstr .= "while calling $sub : \"$error\"";
  31.         $self->_log();
  32.         die "$error\n";
  33. }
  34.  
  35. sub _log {
  36.         my $self = shift;
  37.         open my $F, '>>', $logfile or return;
  38.         print {$F} $errstr."\n";
  39.         close $F;
  40. }
  41. 1;
  42.  
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


Al ejecutar caller.pl se produce un error ya que no se ha especificado parámetro alguno a TEST->new(), el cuál debería recibir una string. En "/tmp/test.log" queda registrado algo como:

Error in caller.pl at line 6 while calling TEST::new : "falta nombre"


Hasta aquí todo bien, funciona a la perfección.
Supongamos ahora que quiero agregar otro módulo que interacciona como puente entre caller.pl y TEST.pm:

caller.pl
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. #!/usr/bin/perl
  2. use lib qw(.);
  3. use strict;
  4. use PUENTE;
  5.  
  6. my $t = PUENTE::new();
  7. print $t->name;
  8. print "\n";
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


PUENTE.pm
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. package PUENTE;
  2.  
  3. use lib qw(.);
  4. use TEST;
  5.  
  6. sub new {
  7.         return TEST->new(shift);
  8. }
  9.  
  10. 1;
  11.  
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


Al ejecutar caller.pl imprimirá en pantalla algo así:
Error in PUENTE.pm at line 7 while calling TEST::new : "falta nombre"


Aun así, mi intención también es de alguna manera saber en qué parte de caller.pl se produjo el error. Para ello he intentado saber la cantidad de llamadas que se han producido, pero aún no logro hacerlo. También he intentado averiguar la cantidad de elementos que posee caller(), pero se me ha hecho imposible.

¿Alguna idea?

¡Saludos!
Perl programming
Avatar de Usuario
kondenado
Perlero nuevo
Perlero nuevo
 
Mensajes: 43
Registrado: 2006-08-21 18:57 @831

Publicidad

Re: Ayuda con función caller

Notapor Jenda » 2009-08-01 01:53 @120

Quizás necesites el módulo Carp.pm. Está instalado siempre y es fácil pedirle que salte un "puente".

Jenda
P.S.: No tienes por qué llamar al caller() tres veces:

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
my ($file, $line, $sub) = ( caller(1) )[1,2,3];
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4
-------------------------------------------------------
- Estoy aquí para practicar español. Si te ayudó mi respuesta ayudame con un mensaje privado sobre mis faltas por favor. Seguramente habrá muchas :-)
Jenda
Perlero nuevo
Perlero nuevo
 
Mensajes: 132
Registrado: 2007-10-29 06:31 @313
Ubicación: Praga, Republica Checa

Re: Ayuda con función caller

Notapor kondenado » 2009-08-01 05:11 @257

Muchas gracias por ambos consejos Jenda, me funcionaron de maravilla :).

¡Saludos!
Perl programming
Avatar de Usuario
kondenado
Perlero nuevo
Perlero nuevo
 
Mensajes: 43
Registrado: 2006-08-21 18:57 @831


Volver a Intermedio

¿Quién está conectado?

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

cron