[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