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