[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.