Cuando faltan parámetros ...
... en la llamada a una función lo normal es efectuar una comprobación al inicio de ésta. Ahora bien, un error común es emplear expresiones de este tipo
1 sub rellenar { 2 my ($texto, $ancho, $relleno) = @_; 3 4 croak "usage: ..." 5 if !texto || !$ancho || !$relleno; 6 7 # etc. 8 }
puesto que alguno de los parámetros puede contener un valor que expande a cero (como el carácter de relleno 0) que sería aceptable en otro caso.
Existe una forma más fiable de verificar esto y consiste en aplicar un test de definición (defined) a cada uno de los elementos.
Gracias al módulo list moreutils disponemos de varias funciones para trabajar rápidamente con listas:
1 use List::MoreUtils qw(any); 2 3 sub rellenar { 4 my ($texto, $ancho, $relleno) = @_; 5 6 croak "usage: ..." 7 if any { !defined $_ } $texto, $ancho, $relleno; 8 9 # etc. 10 }
En el caso de que un valor undef sea aceptable para uno ó todos los parámetros bastará con comprobar si tenemos tantos como esperamos, pero sin inspeccionar su valor:
1 sub rellenar { 2 croack "usage: ..." if @_ != 3; 3 4 my ($texto, $ancho, $relleno) = @_; 5 6 # etc. 7 }
Como vimos en [[el paso de parámetros por nombre|perl/pbp/essential/named_arguments]] teníamos otra posibilidad bastante común: uno ó más parámetros fijos seguidos por un hash con el resto. Y en este caso también es posible verificar el número de parámetros (e incluso su contenido) de manera sencilla:
1 sub rellenar { 2 croak "usage: ..." if @_ < 1 || @_ > 2; 3 4 my ($text, $arg_ref) = @_; 5 6 # etc. 7 }