Página 1 de 1

Ayuda con función caller

NotaPublicado: 2009-07-31 20:09 @881
por kondenado
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.002 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!

Re: Ayuda con función caller

NotaPublicado: 2009-08-01 01:53 @120
por Jenda
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

Re: Ayuda con función caller

NotaPublicado: 2009-08-01 05:11 @257
por kondenado
Muchas gracias por ambos consejos Jenda, me funcionaron de maravilla :).

¡Saludos!