[l-linux] Duda de perl...

Ernesto Hernandez-Novich emhn at telcel.net.ve
Sun Nov 3 10:02:45 CST 2002


On Sat, 2 Nov 2002, Salvador Sosa wrote:
> Hola a los gurus de Perl...
> Todavía estoy traduciendo en script csv2vcard de
> evolution (dispongo de poco tiempo para invertir en
> esto).
>
> El problema lo tengo con la fecha.
> Microsoft Outlook exporta las fechas a veces en
> formato no compatible con Y2k (01/11/02) y a veces en
> formato "extendido" (01/11/2002). El problema que
> tengo es que cuando tiene que interpretar la fecha no
> la interpreta (dd/mm/yyyy) sino (mm/dd/yyyy). Alguien
> puede orientarme donde cambio esto, imagino que en
> Perl? O en el script? esto viene de algo como \d\d.
[...]
>       if ($temp =~ /(\d\d)\/(\d\d)\/(\d\d)/) {
>         # Y2k !!  MS Didn't learn anything.
>         # Hope no one was born before 1915
>         if ((1900 + $3) < 1915) {
>           print $fh "$key:20$3-$1-$2\n";
>         } else {
>           print $fh "$key:19$3-$1-$2\n";
>         }

Cuando se trabaja con expresiones regulares (man perlre) uno puede
"guardar" los resultados de una coincidencia en variables generadas
automáticamente.

$temp =~ /(\d\d)\/(\d\d)\/(\d\d)/

quiere decir "verifica si $temp coincide con el siguiente patrón

dos dígitos (guárdalos)
una barra
dos dígitos (guárdalos)
una barra
dos dígitos (guárdalos)"

Los "guárdalos" quieren decir, colócalos en $1, $2, $3 ..., de modo que
en el bloque de código inmediato puedes usar esas variables. En este
caso, la persona que escribió el código asume (no se si bien o mal) que
$1 es el mes, $2 es el día y $3 es el año; lo que te queda es cambiar
esa interpretación y listo (modificando los print).

Por cierto, notarás los \/ para escapar la /. El autor no es muy versado
en Perl, puesto que el operador de "matching" s puede cambiar sus
delimitadores para hacerlo ver más bonito, i.e.

$temp =~ /(\d\d)\/(\d\d)\/(\d\d)/

es equivalente a


$temp =~ m/(\d\d)\/(\d\d)\/(\d\d)/

que es equivalente a (por ejemplo)

$temp =~ m|(\d\d)/(\d\d)/(\d\d)|

o bien

$temp =~ m#(\d\d)/(\d\d)/(\d\d)#

Nótese que al usar "|" o "#" como delimitador, el propósito de la
búsqueda es mucho más claro y evito tener que escapar las barras.
-- 
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 doesn't exist or isn't important.
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