Como se hace algo como un 'switch' de C

Daniel Sol Llaven daniel@simba.dgsca.unam.mx
Wed, 10 Sep 1997 11:46:25 -0600 (CST)


Saludos!!!

On Tue, 9 Sep 1997, Roberto Ruiz Cantu wrote:
> Estoy haciendo un pequeño script para separar mis mensajes en las
> diferentes listas a las que estoy subscrito, para asi poder checar mas


Mmmm, interesante problema.

En efecto, una serie de else-if es lo mas parecido a un switch que tiene 
perl, pero en este caso en particular, creo que podrias dar una solucion 
mucho mas, digamos, divertida al asunto.

Note que simplemente decides a que archivo vas a sacar el resultado en 
base a la lista a la que se dirigio el corre (cuyo valor conoces de 
hecho), asi pues, lo que necesitas es un valor en funcion de otro.
Ping!, Hashes!....
Asi que para en vez de tener un switch uses un hash tendrias que poner 
algo como lo siguiente (el codigo es solo una inspiracion momentanea, no 
esta probado por lo que seguramente tendra errores y recomendaria 
probarlo primero).

> if ($fields{'Sender:'} =~ /\bowner-linux-ayuda\@nuclecu\.unam\.mx\b/i) {
>     $salida = ">> mail/0nuclecu-ayuda";
> } elsif ($fields{'Sender:'} =~
> /\bowner-linux-admin\@nuclecu\.unam\.mx\b/i) {
>     $salida = ">> mail/0nuclecu-admin";
> } elsif ($fields{'Sender:'} =~ /\bowner-linux-org\@nuclecu\.unam\.mx\b/i)
> {
>     $salida = ">> mail/0nuclecu-org";
> } elsif ($fields{'Sender:'} =~ /\bowner-linux\@nuclecu\.unam\.mx\b/i) {
>     $salida = ">> mail/0nuclecu-linux";
> } elsif ($fields{'Sender:'} =~ /\bowner-linux\@linux\.com\.ar\b/i) {
>     $salida = ">> mail/0argentina-linux";

#Todo esto es digamos inicializacion, recomendable al inicio del programa
#Directorio de salida:
$dir="mail"
#creacion del hash de lista-archivo 
%liar=("owner-linux-ayuda\@nuclecu.unam.mx"=>"0nuclecu-ayuda",
"owner-linux-admin\@nuclecu.unam.mx"=>"0nuclecu-admin",
"owner-linux-org\@nuclecu.unam.mx"=>"0nuclecu-org",
"owner-linux\@nuclecu.unam.mx"=>"0nuclecu-linux",
"owner-linux\@linux.com.ar"=>"argentina-linux");

#--------------------------------------------------
# Ahora reemplazando al codigo que pones en tu mensaje queda:
#esto seguramente requerira ajuste, hay que sacar el sender como esta en 
#el hash, y ya no se valdra ignorar mayusculas y minusculas (lcase?)
$fields{'Sender:'}=~/\b(.*?\@.*?)\b/;
$sender=$1;
$salida=">> $dir/".$liar{$sender};

#Y aqui continuarias como si nada.

Eso si, sugerencias para no hacer dificil lo facil:
Si puedes averiguar las cadenas completas que llegan en el campo 
"Sender:" usalas y quitate de problemas en el hash, de lo contrario, 
ajusta la expresion que obtiene $sender para que saque solo, digamos, el 
login de la lista de correo, de modo que tanto las llaves del hash sean 
mas cortas como que sea mas sencilla la exprecion que la extrae. Ademas, 
si tienes mayusculas y munisculas en la llave (y no son necesarias) 
aplica la funcion "lc" para pasarlo todo a minusculas.

Sale!, espero que esto sirva!
Porque solo lo escaso se cobra: Daniel Sol Llaven

Bolo Lacertus: lacertus@servidor.dgsca.unam.mx			==~\___\
http://132.248.71.81/cgi-bin/lacertus/hola			 =__vvvv
-----BEGIN GEEK CODE BLOCK-----
Version: 3.1
GCS/GE/GED d>d? s:+ a-- C++>+++$ US+++$ P++++$ L E? W++>+++ N++ o? K- 
w--- O !M V-- PS+ PE-- Y+ PGP++ t+ 5? X- R@ tv-- b++@- DI++ D+ G++ e+>++ 
h* r++(*) z+ 
------END GEEK CODE BLOCK------