[Perl] equivalencia de un case

Salvador Ortiz Garcia sog@msg.com.mx
12 Mar 2002 14:11:40 -0600


On Tue, 2002-03-12 at 13:42, Salman PSL wrote:
> Voy a implementar en una programacion que tengo operativa en PERL un modu=
lo de traduccion por llamarlo de alguna forma.
>=20
> Se trata de hacer algo como el sistema que utiliza el php-nuke
>=20
> Pero PERL no tiene ninguna sentencia equivalente.
>=20
> A mi se me ha ocurrido lo siguiente:
>=20
> sub TomarMensaje {
>  my ($MensajeNumero) =3D @_ ;
>  SWITCH:
>  {
>   if ($MensajeNumero eq "0001") { $MensajeTexto=3D"Mensaje Numero uno"; l=
ast SWITCH; }
>   if ($MensajeNumero eq "0002") { $MensajeTexto=3D"Mensaje Numero DOS"; l=
ast SWITCH; }
>  }
>=20
>  return $MensajeTexto;
> }
>=20
> =BF A alguien se le ocurre algo mas elegante y sencillo ?
>=20

Si te gusta la idea del 'case', se ve mejor asi:

sub TomarMensaje {
   my $MensajeNumero =3D shift;
   for($MensajeNumero) {
        /^0001$/ && do { $MensajeTexto=3D'Mensaje n=FAmero uno'; last };
        /^0002$/ && do { $MensajeTexto=3D'Mensaje n=FAmero dos'; last };
        # Etc.
        $MensajeTexto =3D "Ninguno de los anteriores'; # Caso default
    }
   return $MensajeTexto;
}

Y por supuesto te puedes ahorar el $MensajeNumero con un "for($_[0]) {"
y el $MensajeTexto si usas return directo.

Ahora que, a mi me gusta m=E1s usando un hash:

my %Maps =3D (
   '0001' =3D> 'Mensaje n=FAmero uno',
   '0002' =3D> 'Mensaje n=FAmero dos',
    # Etc;
};

sub TomarMensaje {
   my $MensajeNumero =3D shift;
   return exists $Maps{$MensajeNumero}=20
       ? $Maps{$MensajeNumero}
       : 'Ninguno de los anteriores';
}

En donde incluso y si est=E1s seguro que no tienes  mensajes "falsos",
puedes dejar como:

sub TomarMensaje {
   return $Maps{$_[0]} || 'Ninguno de los anteriores';
}


Saludos.

Salvador Ortiz.