¿Cual es el comportamiento correcto de una función cuando es llamada con
argumentos erróneos?
Parece razonable que el comportamiento de tal función sea advertir
al programador de la conducta anómala y en su caso detener la ejecución
del programa llamando a die
o a croak
.
¿Que ocurre si dentro de un programa de prueba .t
queremos comprobar el funcionamiento de tal subrutina bajo
situaciones de ''stress'' como esta, por ejemplo,
con argumentos erróneos?
La respuesta es que - si se hace una llamada convencional - la llamada
a die
dentro de la subrutina investigada provocará la ''muerte prematura''
del programa de pruebas.
A continuación realizamos una prueba para comprobar el funcionamiento
cuando se le pasan a Knap01DP
vectores de pesos y beneficios de
distinto tamaño. Recordemos que en la rutina Knap01DP
habíamos
escrito el siguiente código:
14 sub Knap01DP { 15 my $M = shift; 16 my @w = @{shift()}; 17 my @p = @{shift()}; 18 19 my $N = @w; 20 my @f; 21 22 croak "Profits and Weights don't have the same size" unless scalar(@w) == scalar(@p); 23 .. .................................................... 38 return @f; 39 } 40 41 sub ReadKnap { 42 my $filename = shift; 43 44 my $file = IO::File->new("< $filename"); 45 croak "Can't open $filename" unless defined($file); .. ............ 47 55 return ($M, \@w, \@p); 56 }por tanto, pasarle a la rutina vectores de distinto tamaño hace que el programa muera. Es por esto que protegeremos la ejecución dentro de un
eval
:
37 # test to check when weights and profits do not have the same size 38 $M = 100; @$w = 1..5; @$p = 1..10; 39 eval { Knap01DP($M, $w, $p) }; 40 like $@, qr/Profits and Weights don't have the same size/;
Ahora la llamada a croak
dentro de Knap01DP
sólo produce
la finalización del eval . El mensaje emitido por croak
o die
queda en la variable especial $@
.
La función like comprueba que el primer argumento casa con la expresión regular especificada en el segundo argumento.
Casiano Rodríguez León