[caracas-pm] Re: [l-linux] Variables en perl (era Re:Actualización de distribución y mapa teclado)

Ernesto Hernandez-Novich emhn at telcel.net.ve
Wed Jul 7 12:50:06 CDT 2004


On Thu, 1 Jul 2004, Luis Roa wrote:
> > Por supuesto. Primero porque los juegos de caracteres unibyte siendo de
> > un byte sólo llegan al 255 (así que no habría que seguir hasta 700), y
> > segundo porque para eso están los lenguajes de programación
> >
> > perl -e 'map{print $_," ",chr($_),"\n"}(128..255)'
> >
>
> Sorry por "colgarme", pero se me presento la oportunidad y pregunto:
>
> ¿Como se hace para que esa linea de perl adquiera el 128..255 desde una
> variable?

Usas una variable.

El operador de rangos .. construye una lista entre los extremos indicados,
previa evaluación de los mismos, con lo que

1..10

es equivalente a

$x = 1;
$y = 10;
$x..$y

de modo que puedes escribir

map { ... } ($inicio..$final)

El _uso_ del operador tiene dos aplicaciones: en contexto lista (como el
que yo ejemplifiqué), el operador genera una lista con los elementos
necesarios y es típicamente utilizara para escribir los índices en
ciclos o el conjunto de elementos sobre los cuales iterar (como el que
yo ejemplifiqué).

Es mucho más eficiente

for (1..100) { ... }

que

for ($i = 1; $i < 100; $i++)

tanto en _tiempo_ como en _espacio_ (y no importa si el salvaje escribe
1..10_000_000_000 porque la lista se genera dinámicamente sin reservar
memoria innecesaria). De paso, en contexto lista el operador utiliza el
incrementador mágico alfanumérico único de Perl, según el cual

('AA'..'ZZ') = ('AA','AB',...,'AZ','BA',...,'BZ','CA',...,'ZY','ZZ')

En contexto escalar, el operador se comporta como un bistable booleano
sobre las _líneas_ de la entrada. Esto quiere decir que inicialmente
comienza como falso, y tan pronto como el límite izquierdo se hace
cierto, continuará siendo cierto hasta que el límite izquierdo se haga
cierto, y después de eso se vuelve a hacer falso. La intención es
utilizarlo para escribir cosas sucintas como

print if ($inicio..$final);

para imprimir las líneas entre $inicio y $final, inclusive; o mejor aún

print unless (/^desde aqui/.../^hasta aqui/);

para imprimir las líneas que _no_ se encuentren entre una línea que diga
"desde aqui" hasta otra línea que diga "hasta aqui".

man perlop

> Si en un script, requiero la digitacion de ese rango y luego invoco una
> funcion del script que es la que ejecuta la linea "perl", a la cual llamo
> mas o menos como sigue:
>
> desplegar( )
>       {
>        perl -e 'map{print $_," ",chr($_),"\n"}(128..255)'
>       }

En este caso, lo que quisieras es que el programa Perl recibiera
argumentos desde la línea de comandos. Existen variables especiales en
Perl para hacer eso

perl -e 'map { print $_," ",chr($_),"\n" } ($ARGV[0]..$ARGV[1])' 128 255

man perlvar
man perlrun

> ¿Como se hace correctamente ?

Escribiendo todo en Perl :-)
-- 
Ernesto Hernández-Novich - On Linux 2.6.6 i686 - Unix: Live free or die!
Geek by nature, Linux by choice, Debian of course.
If you can't apt-get it, it isn't useful or doesn't exist.
GPG Key Fingerprint = 438C 49A2 A8C7 E7D7 1500 C507 96D6 A3D6 2F4C 85E3



More information about the caracas-pm mailing list