[Perl] Como llamo a una rutina
Salvador Ortiz Garcia
sog@msg.com.mx
24 Jan 2002 17:17:32 -0600
On Thu, 2002-01-24 at 12:06, Rodrigo Gallardo wrote:
> Gunnar Wolf writes:
> > > > Antes de que alguien que sepa por qu=E9 pasa esto (que supongo qu=
e se llama
> > > > Salvador), deja intentarlo: foo es una "unqualified bareword", qu=
e no
> > > > significa nada a=FAn ni siquiera para el parser?
> > >
> > > Pero seg=FAn yo, una 'bareword', en ausencia de 'use strict' signifi=
ca
> > > llamada a funci=F3n. Y la funci=F3n deber=EDa estar definida para cu=
ando se
> > > ejecuta el print, puesto que perl primero compila y despues
> > > evalua. (aqui no hay ningun BEGIN, =BFo si?)
> >=20
> > Es justo por eso que no lo dije con autoridad :-) Me *parece* que eso
> > es... Dime, =BFqu=E9 pasa si lo calificas con un &?
>=20
> Entonces ambos mueren con un mensaje de error: "Number found where
> operator expected"
>=20
> > ...O puede ser una jalada obscura como la que me comentabas de
> > my $var =3D 0 || ++$var; ...
>=20
> Lo es. SALVADOOOOR.
Ok, creo que qued=F3 claro que en perl el orden de las definiciones,
declaraciones y sentencias modifica radicalmente el asunto. Pero la demo
vale una explicaci=F3n.
Caso 1:=20
En ausencia de de una definici=F3n (o declaraci=F3n) previa, foo en el
contexto de 'print foo 1' ser=E1 un FILEHANDLE y nada te impide imprimir
en uno cerrado, solo print falla, pero pocas personas revisan (tip!) lo
devuelto por print:
$ perl -e 'print foo 1 or die "No puedo imprimir"'
$ perl -e 'print STDOUT 1 or die "No puedo imprimir"'
El que posteriormente se defina sub foo no modifica en nada el asunto.
Caso 2:
En presencia de la declaraci=F3n de sub foo, implicada en su definici=F3n,
'print foo 1' es equivalente a 'print foo(1)' pues los par=E9ntesis son
opcionales para funciones predeclaradas. Hago la distinci=F3n entre
declaraci=F3n y definici=F3n pues con la primera basta:
$ perl -e 'sub foo; print foo 1; sub foo { $_[0] + 1 }'
Pocas personas predeclaran las funciones, pero entonces el orden de las
definiciones importan, incluso para variables:
$ perl -e '$foo =3D 1; my $foo; print $foo'
$ perl -e 'my $foo; $foo =3D 1; print $foo'
Notas adicionales:
- Un 'bareword' termina siendo algo dependiendo del contexto.
- El que perl primero "compile", no implica que las definiciones se
ejecuten en tiempo de compilaci=F3n.
- El uso de & para invocar funciones, famoso de los tiempos de perl4,
tiene en perl5 important=EDsimos impactos sem=E1nticos, y no debe usarse
a menos que uno sepa lo que se est=E1 haciendo. Eso ser=E1 tema para alg=
=FAn
otro d=EDa.
Saludos.
Salvador Ortiz.