Creative Commons License
Excepto donde se indique otra cosa, todo el contenido de este lugar está bajo una licencia de Creative Commons.
Taquiones > perl > pbp > essential > Cuando faltan parámetros

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 }