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