Re: [caracas-pm] Re: [l-linux] Variables en perl (era Re:Actualización de distribución y mapa teclado)
Luis Muñoz
lem at cantv.net
Wed Jul 7 15:14:23 CDT 2004
El Jul 7, 2004, a las 1:50 PM, Ernesto Hernandez-Novich escribió:
> Es mucho más eficiente
>
> for (1..100) { ... }
>
> que
>
> for ($i = 1; $i < 100; $i++)
hmmm. Sospecho del señor mostaza, con el candelabro, en la cocina...
El operador .. (en Perl 5.x) genera la lista completa _antes_ de que
for tenga la oportunidad de comenzar a tomar elementos. El segundo
loop, en sintaxis "C", es más eficiente en este contexto porque maneja
únicamente un escalar y no hay pase de listas de qué preocuparse.
Verás que si haces algo como
perl -e 'print 1..1_000_000_000_000, "\n"'
El tamaño de tu instancia de Perl crecerá (y si no te quedas sin
memoria, posíblemente me dará un ataque de envidia). Eso indica que se
genera la lista en memoria. Si haces algo como:
perl -e '$|++; print $_ for 1 .. 1_000_000_000_000'
Verás que el proceso (o tu máquina) muere antes de que se imprima el
primer número.
En Perl 6.x, la cosa es distinta, porque tiene algo llamado "Lazy
lists". Esas listas flojas, sólo producen elementos cuando algo "se lo
pide", permitiendo hacer cosas interesantes como por ejemplo:
while (my ($x, $y) = 1 .. Inf)
{
...
}
De todos modos, aun en ese escenario sospecho que el loop con sintaxis
"C" debe ser más eficiente.
Saludos.
-lem
--
#!/usr/bin/perl -w
use strict;
$_[$_]=0for 0..7;for$'(grep{s@^..@@}unpack"\1028"x28,join'',split//,
qq{=\37\34 \24(\31??\11\64:1\22\36/\24\2\12\4\b??\1\$\2\15\36}){$/=0
;grep{$_[$/++].=$_}split//,$';length$_[0]&@_&&print pack"\1028",$_
for at _;length$_[3]&@_&&grep{$_&=0}@_;}print"\n";
More information about the caracas-pm
mailing list