[l-linux] Perl. Alguien puede descifrarme esta linea??

Ernesto Hernandez-Novich emhn at telcel.net.ve
Thu Oct 24 13:19:22 CDT 2002


On Thu, 24 Oct 2002, Salvador Sosa wrote:
> Estoy traduciendo el script csv2vcard al español pero
> tengo problema con los acentos, los cuales no pasan
> porque esta línea lo limita a los caracteres A-Za-z-_'
>
> # Valid chars for lookup (from Outlook CSV) are
>   # A-Za-z0-9_-'/
>   # Valid chars for formatting of attr are
>   # \s,|
>
> my @lookup = map { s/=0A$//; s/[^\w\s\-'\/]//; $_; }
> split /[\s,]*\|[\s,]*/, $def;
>
> Alguno sería tan amable de descifrarme esto a ver como
> le agrego los caracteres que faltan.

Es un ejemplo hermoso de programación funcional

Por partes:

Se supone que $def tiene una cadena de caracteres.

split /[\s,]*\|[\s,]*/, $def
      \______ X _____/

quiere decir "corta $def en los lugares donde haya X" y
devuelve una lista. En este caso X es una expresión regular
que identifica pipes (|) con posiblemente espacios en blanco o
comas a ambos lados.

Entonces ahora tienes una lista Y de los "campos". A todos los
elementos de esa lista quieres aplicarle una operación; un programador
"estándar" usa un for con una variable temporal, construye otra lista...
bah. En perl puedes usar map <funcion> @lista, que es un for implícito:
a cada elemento de la lista se le aplica la función (la función puede
ser con nombre, o anónima como en este caso que es mucho más elegante)
y el resultado de dicha aplicación es una nueva lista, i.e.

(2,4,6,8) = map { $_ * 2 } (1,2,3,4);

Entonces quieres aplicar la función

 s/=0A$//; s/[^\w\s\-'\/]//; $_;

a cada elemento de la lista Y, para obtener una nueva lista modificada;
dentro de la función, el modificando en curso es $_, entonces:

s/=0A$//;           ... si el elemento termina en "=0A", le quita eso
s/[^\w\s\-'\/]///   ... cualquier cosa que _no_ (^) sea
                        caracter de una palabra (\w),
			espacio en blanco (\s),
			guión (\-)
			comilla simple (')
			o barra (\/), se elimina
$_                  ... y se retorna el valor del modificando

Entonces en @lookup vas a tener los elementos de la lista Y después
de haberles aplicado a cada uno la modificación.

Tu quieres que te respete los acentos:

- Si los acentos están _literales_ (á, ñ, etc.), el \w los toma
  siempre y cuando tengas 'use locale' y las variables LANG, LC_*
  correctamente configuradas.
- Si los acentos están codificados, tienes que hacerlo a mano,
  modificando la función anónima que usa map.
-- 
Ernesto Hernández-Novich - Running Linux 2.4.19 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

------------------------------------------------------------------------
Enviar e-mail a <majordomo at pm.org> colocando en el cuerpo:
"UNSUBSCRIBE caracas-pm-list" para desuscribirse.
"INFO caracas-pm-list" para conocer las reglas de etiqueta.
------------------------------------------------------------------------



More information about the caracas-pm mailing list