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