[Perl] equivalencia de un case
Gunnar Wolf
gwolf@campus.iztacala.unam.mx
Thu, 14 Mar 2002 11:25:37 -0600 (CST)
> >El &{...} hace que lo ejecute como una subrutina, del mismo modo que un
> >@{$ref} eval=FAa $ref, que debe ser una referencia a un arreglo, y lo
> >regresa como arreglo.
>
> OH!!!! Ser=EDa como llamarlo a trav=E9s de un eval, pero mucho "mas"
> mejor???
No, no, nada de eso. Un eval lanza un int=E9rprete de Perl para que corra l=
o
que est=E1 dentro de la cadena (si lo llamas como eval "cosas-a-ejecutar") =
o
bloque (con eval {cosas-a-ejecutar}). Ambos casos pueden serte muy =FAtiles=
,
para prop=F3sitos diferentes.
Por ejemplo, si quieres construir un int=E9rprete interactivo minimalista d=
e
Perl, te basta con:
#!/usr/bin/perl -w
use strict;
while (my $cmd=3D<STDIN>) {
eval $cmd;
}
Esto es, llamas a eval con una cadena. Obviamente, la cadena cambiar=E1 cad=
a
que la llames, por lo cual cada eval compilar=E1 la expresi=F3n cada que se=
a
llamada. Por otro lado, puedes usar a eval para atrapar errores, como el
cl=E1sico:
(...)
$dbh->{AutoCommit}=3D0;
$dbh->{RaiseError}=3D1;
eval {
$dbh->do($sql1);
$dbh->do($sql2);
$dbh->do($sql3);
$dbh->commit;
};
if ($@) {
warn "Chale... No pude: $@";
$dbh->rollback;
}
Esto hace que el c=F3digo dentro del eval (que en este caso es muy simple,
pero puede incluir cualquier cosa) corra en un sub-int=E9rprete, y si se
muere, guarde la raz=F3n de su muerte en $@. Este ejemplo lo tom=E9 de perl=
doc
DBI, as=F3mate para m=E1s informaci=F3n. Y claro, lee tambi=E9n perldoc -f =
eval :)
El llamar a un c=F3digo dentro de una referencia es lo mismo que llamar a u=
n
arreglo dentro de una referencia - El hacer &{$hash{$var}}($arg) (al
estilo Gunnar) o $hash{$var}->($arg) (al estilo Salvador) se convierte en
una llamada normal a una funci=F3n.
Sal=FAs,
--=20
Gunnar Wolf - gwolf@campus.iztacala.unam.mx - (+52-55)5623-1118
PGP key 1024D/8BB527AF 2001-10-23
Fingerprint: 0C79 D2D1 2C4E 9CE4 5973 F800 D80E F35A 8BB5 27AF