En Perl , generalmente, tenemos que leer archivos CSV (valores separados por comas) para extraer los datos requeridos. A veces hay fechas en el nombre del archivo como ejemplo 2014-02-12T11:10:10.csv o podría haber una columna en un archivo que tenga una fecha. Estas fechas pueden tener cualquier patrón como YYYY-MM-DDThh:mm:ss o dd/mm/yyyy hh.mm.ss . Para manejar esas fechas; los scripts de Perl deben ser lo suficientemente flexibles para manejar diferentes tipos de formatos de fecha en una string. Necesitamos usar la función de expresión regular para extraer fechas de una string. Una expresión regular es una string de caracteres que define el patrón o patrones específicos que está viendo. El método básico para aplicar una expresión regular es utilizar los operadores de vinculación de patrones =~ y !~.
En Perl hay varias bibliotecas disponibles para manejar la fecha y la hora, como Date::Parse y Time::Piece; ambas bibliotecas vienen con muchas funciones flexibles para manejar los requisitos más complejos. Pero estas bibliotecas no forman parte de los módulos estándar de Perl, debe instalarlas por separado.
Para formatos de fecha generales, es bueno encontrar expresiones regulares específicas sin instalar ninguna biblioteca nueva. Veamos algunos ejemplos de análisis de una fecha de una string en Perl.
Antes de ver ejemplos para extraer la fecha de una string, debemos mirar estos metasímbolos que se usan para analizar una expresión en una string:
^ | el metacarácter coincide con el comienzo de la string |
ps | metasímbolo coincide con el final de la string |
* | coincide con 0 o más apariciones de la expresión anterior |
+ | coincide con 1 o más ocurrencias de la expresión anterior |
? | coincide con 0 o 1 aparición de la expresión anterior |
Aquí hay algunos ejemplos breves.
/^$/ | # nada en la string (el inicio y el final son adyacentes) |
/(\d\s) {3}/ | tres dígitos, cada uno seguido de un espacio en blanco. Por ejemplo: 6 7 8 |
/(a.)+/ | coincide con una string en la que cada letra siguiente es una |
/^\d+/ | la string comienza con uno o más dígitos |
/\d+$/ | la string termina con uno o más dígitos |
No se requiere un módulo separado para la expresión regular. Está integrado en Perl (cualquier versión). Por lo tanto, debe tener Perl (cualquier versión) instalado en su sistema. Veremos algunos ejemplos para extraer la fecha, en un formato diferente, de una string usando Perl regex.
Ejemplo 1:
En este ejemplo veremos cómo extraer fecha con patrón, aaaa-mm-ddThh:mm:ss, de una string en Perl. El siguiente ejemplo 1 muestra una string sample2018-03-21T12:10:10.csv de la que necesitamos extraer la fecha en las variables de año, mes y fecha para que se pueda utilizar para más secuencias de comandos.
Aquí, la expresión regular \d\d\d\d asegura que el patrón de fecha en la string debe comenzar con el patrón de 4 dígitos. De lo contrario, puede generar una excepción de variable no inicializada debido a que falta un patrón en la string.
¿Qué significa /d?/d? Este patrón asegura que el mes, el día, las horas, los minutos y los segundos puedan estar en 1 o 2 dígitos.
Por ejemplo:
2013-9-21T11:3:30
2014-12-3T9:1:10
Entonces /d?/d asegurará que la expresión dejada a ? es opcional y se ejecutará sin ningún error.
Perl
#!/usr/bin/perl # your code here my $str = "sample2018-03-21T12:10:10.csv"; my (($year, $month, $day, $hour, $min, $sec) = $str =~ /(\d\d\d\d)-(\d?\d)-(\d?\d)T(\d?\d):(\d?\d):(\d?\d)/); print "year : $year month:$month day:$day - hour:$hour minute:$min seconds:$sec\n";
Producción:
year : 2018 month:03 day:21 - hour:12 minute:10 seconds:10
Ejemplo 2:
En este ejemplo, veremos cómo extraer la fecha con el patrón mm/dd/yyyy hh.mm.ss de una string. La fecha puede ser parte del nombre del archivo o podría ser un contenido. Entonces, el siguiente ejemplo ayudará a analizar la fecha con el formato mm/dd/aaaa hh:mm:ss de una string. En este ejemplo hemos tomado una string test_28/04/2017 11.00.00 ; donde fecha comienza con 2 dígitos 28 seguido de barra invertida /
Aquí, (\d?\d) regex asegura que la string comenzará con el patrón con 2 o 1 dígito seguido de /. La barra invertida \ se coloca delante del . para asegurarse de que solo coincida con los puntos y no con todos los caracteres como suele hacerlo.
Perl
#!/usr/bin/perl # your code here my $str1 = "test_28/04/2017 11.00.00"; my (($month1, $day1, $year1, $hour1, $min1, $sec1) = $str1 =~ m{(\d?\d)/(\d?\d)/(\d\d\d\d) (\d\d)\.(\d\d)\.(\d\d)}); print "year:$year1 month:$month1 day:$day1 - hour:$hour1 minute:$min1 seconds:$sec1\n";
Producción:
year:2017 month:28 day:04 - hour:11 minute:00 seconds:00
Ejemplo 3:
Aquí veremos un patrón de fecha más que es {Day}, dd {mon} aaaa hh:mm:ss como el martes, 11 de febrero de 2014 11:01:54 +0100 (CET); A veces, los archivos CSV tienen un valor de columna de fecha en un formato anterior que no es legible para las operaciones de Perl, por lo que queremos extraer el año, el mes y la fecha de este formato y usarlo según sea necesario.
Aquí, .+?(\d+) expresión regular significa que habría algunos caracteres antes de los dígitos de fecha 11, después de eso \s(.+?) expresión regular significa que la fecha es seguida por un espacio y una string de caracteres que es Feb, s(\d+ )/ regex asegura que el 11 de febrero sea seguido por un espacio y varios dígitos que son 2014. Guardamos estos valores en las variables definidas para día, mes y año; que se puede utilizar en la secuencia de comandos adicional.
Perl
#!/usr/bin/perl # your code here my $string = 'Date: Tue, 11 Feb 2014 11:01:57 +0100 (CET)'; my ($day3, $month3, $year3) = $string =~ /Date:.+?(\d+)\s(.+?)\s(\d+)/; print "Day:$day3 month:$month3 year:$year3\n";
Producción:
Day:11 month:Feb year:2014