[Perl] Como llamo a una rutina

Rodrigo Gallardo lgallardo@computacion.cs.cinvestav.mx
Fri, 25 Jan 2002 13:49:15 -0600


Alejandro G. Bedoya writes:
 >=20
 > > Est=E1s de necio, verdad?
 >=20
 >     Pos tu, que estas peor que la Sant=EDsima Inquisici=F3n. Que si =
uno dice
 > libreria es pecado capital, que si lo otro, que si esto... lo =FAnic=
o que hay
 > que entender es que:

No es pecado. Es mal uso del lenguaje. Que puede llevar a confusi=F3n,
como con toda esta hebra. Y que por lo menos lo desvirtua. Si el =FAnic=
o
uso del lenguaje es comunicar, =BFpa que sirve la poesia?

 >             1;
 >             sub algo {
 >                     blah!
 >                 }
 >=20
 > es igual a
 >=20
 >             sub algo {
 >                     blah!
 >                 }
 >             1;
 >=20

Nadie ha negado eso. Se ha negado tu afirmaci=F3n de que 'en perl, el
orden de las sentencias no importa'. Y se ha dicho que es
convencional, y menos propenso a errores, poner el 1; al final.

 > > N=F3tese el "These may be located anywhere in the main program".
 >=20
 > >N=F3tese que estabamos hablando del orden en bibliotecas y que el p=
=E1rrafo
 > >que citas habla del lugar de la definici=F3n.
 >=20
 >     Ah, perd=F3n, se me olvidaba que tambien eres perito en traducci=
ones....
 > Pero si lees atentamente dice "Like many languages, Perl provides fo=
r
 > user-defined subroutines. These may be located anywhere in the main
 > program", en donde THESE se refiere a las USER-DEFINED SUBROUTINES,
 > indicando ademas que pueden estar en bibliotecas.

Si. Pero LOCATED se refiere a DEFINIDAS. Y de lo que se est=E1 hablando=

es que DECLARARLAS antes o despues de usarlas modifica el como se
interpreta una sentencia. Como una llamada o como algo m=E1s.

 > >El que no uses par=E9ntesis donde no los necesitas no implica que e=
st=E9s
 > >programando inadecuadamente, pues aunque usted no lo crea, perl es =
de
 > >los pocos lenguajes en que un par de par=E9ntesis de m=E1s cambia l=
a
 > >sem=E1ntica de las cosas, as=ED que la practica com=FAn de ignorar =
la
 > >precedencia mediante parentizar a raja tabla, puede resultar
 > >peligros=EDsimo. C.f. ejemplo com=FAn de 'my $a =3D ...' vs 'my($a)=
 =3D ...'
 >=20
 >     Claro que cada quien puede programar como quiera, y mas en PERL =
seg=FAn
 > tengo entendido, pero es com=FAn poner parentesis en los parametros =
en las
 > funciones, tan es as=ED que en la misma p=E1gina que menciono usan e=
n los
 > ejemplos dichos parentesis. En lo personal, yo considero que se ve m=
as
 > entendible con parentesis las funciones, de por si PERL parece lengu=
aje de
 > solo escritura.

No es solo cuesti=F3n de programar como quieras. En perl no es lo mismo=

poner

print 1, 2;

que

print (1), 2;

que

print (1, 2);


Y el problema no es con estos ejemplos bobos, sino que, cuando tienes
algo m=E1s complicado, si la precedencia se hace bolas y quieres
arreglarla con parentesis, cambias el significado del print, y ni
cuenta te das. De modo que poner-parentesis-aunque-no-se-necesiten,
pr=E1ctica comun y recomendada en otros lenguajes, no lo es en perl, po=
r
que tiene efectos secundarios.


 > >El que el tu veas un foo(bar) no implica que bar sea par=E1metro de=
 la
 > >funci=F3n foo, pues eso depende de la declaraci=F3n de foo.
 >=20
 >     Tampoco foo bar, y?

Pues que por eso importa la declaraci=F3n. El significado sin
declaraci=F3n no es el mismo que con. En ninguno de los dos casos. Y
como el significado se determina en tiempo de *compilaci=F3n*, es
importante que la declaraci=F3n est=E9 *antes*, para que el significado=

sea el que quieres, y no el que perl tiene por defecto.

 > >En resumen, el que perl no requiera, por default que declares las c=
osas
 > >como en otros lenguajes, no implica que no importe si las declaras =
o no,
 > >y puesto que el orden de las declaraciones importa y como las
 > >definiciones pueden implicar declaraciones su orden tambi=E9n puede=

 > >importar.
 >=20
 >     Pues depende de tu nivel de programaci=F3n el que quede bien el =
programa
 > al final, si declaras o no es tu bronca.=20

No. Si declaras o no depende de lo que quieras hacer. Que en la
mayor=EDa de los casos no declarar quede bien no significa que siempre
quede bien.

 > "No es lo mismo papaya tapatia, que
 > t=EDa tapate la papaya". Depende de lo que quieras decir, lo bueno e=
s que PERL
 > te permite poner las funciones despues de llamarlas, si ya dices otr=
a cosa
 > es tu bronca, pero sin embargo te deja hacerlo.

Por n-=E9sima ves. Entiende la diferencia entre declarar y definir. La
declaraci=F3n es para la compilaci=F3n. La definici=F3n es para la ejec=
uci=F3n.

 >=20
 > >Y volviendo al punto original, como el valor devuelto por 'do' es e=
l de
 > >la _=FAltima_ sentencia evaluada la _mejor_ forma para garantizar q=
ue 1;
 > >(o cualquier otro valor 'verdadero') sea =E9sa =FAltima sentencia e=
s ponerla
 > >al final.
 >=20
 >     Cual do???=20

El que est=E1 impl=EDcito en el use. =BFNo has estado leyendo?=20

Es la =FAnica forma de garantizarlo por que nadie te asegura que, 4
meses despues de escribir tu biblioteca, se te ocurra ponerle una
inicializaci=F3n y se te olvide que ahora esto es lo =FAltimo que se
ejecuta. O que alguien m=E1s que trabaja contigo lo haga.

 > La =FAnica forma de garantizar algo, es programando
 > adecuadamente.=20

Y la =FAnica forma de hacerlo, es conociendo a fondo el lenguaje en el
que lo haces. Si en vez de entender las sutilezas, les sacas la
vuelta, tarde o temprano te van a morder.


 >     P: Porque PERL no tiene forma de declarar constantes???
 >=20
 >     R: Porque un buen programador jam=E1s modificaria una variable p=
or error.

Lo cual muestra la necesidad de conocer el lenguaje. Por que si hay
forma de hacerlo. Intenta

perl -e '$pi =3D \3.141592;print $$pi; $$pi =3D 5'




--=20
Rodrigo