[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