Muchas gracias por el aporte, scout. Solo unas consideraciones...
¿Para qué necesitas usar el módulo Modern::Perl? No veo que estés usando ninguna característica nueva de Perl v5.10. Si acaso, activar el modo 'strict' y los 'warnings'.
En cuanto a la fecha, parece que $cadena está en formato ISO-8601, así que está en un formato estándar.
A veces es interesante pasar de ese formato a otro más compacto, porque no es necesaria tanta información. Por ejemplo, poner la fecha en el nombre de un fichero.
En cuanto a la forma de extraer la información de ese formato, deben existir muchas, ya que estamos hablando de una cadena de caracteres.
Si tu solución funciona, perfecto.
En otros ambientes quizás se prefiera tener un control más férreo de la fecha que tenemos que tratar, porque, ¿realmente estamos seguros de que vamos a procesar siempre el mismo formato de fecha?
Como es normal, yo usaría la familia de módulos DateTime, que, para un problema pequeño, es algo excesivo, pero es necesario en cuanto el programa se va complicando.
Using perl Syntax Highlighting
use DateTime
::Format::ISO8601;
my $cadena = '2009-11-02T00:00:00';
my $dt = DateTime
::Format::ISO8601->parse_datetime( $cadena );
die "ERROR: Fecha no es correcta: [$cadena]\n" if !$dt;
print $dt->ymd(''), "\n"; # 20091102
print $dt->dmy(''), "\n"; # 02112009
Coloreado en 0.001 segundos, usando
GeSHi 1.0.8.4
Lo que no hay que hacer es hacérselas de listillo y resolverlo en una línea
Using perl Syntax Highlighting
my $cadena = '2009-11-02T00:00:00';
my $fecha = join '', ($cadena =~ /(\d+)/g)[0
..2
]; # Buscamos los tres primeros valores numéricos
print "$fecha\n"; # 20091102Coloreado en 0.001 segundos, usando
GeSHi 1.0.8.4
(salvo que documentemos lo que hacemos. En este caso, funciona de la siguiente manera:
- Pasamos $cadena por una expresión regular, en la que buscamos, de forma repetitiva (/g), conjuntos de números (\d+), que son capturados por los paréntesis, y convertidos en una lista de valores
- Como esa lista la tenemos encerrada entre paréntesis, es como si tuviéramos un arreglo. Así que ahora es lícito sacar de él, los 3 primeros valores ([0..2])
- El resultado son tres valores, que son unidos con join() en un solo valor escalar.
)
Otra solución parecida a la tuya sería esta:
Using perl Syntax Highlighting
my $cadena = '2009-11-02T00:00:00';
my $fecha = join '', split '-', (split 'T', $cadena)[0
];
print "$fecha\n";Coloreado en 0.001 segundos, usando
GeSHi 1.0.8.4
de cuya explicación queda como ejercicio para el lector
Y muchas más formas de resolverlo, que seguro que alguno de vosotros se le ocurre... pero recordad: si funciona,
estupendo, pues eso es lo principal.
Perl nos brinda la capacidad de buscar múltiples soluciones o, mejor dicho, de hallar antes una solución. Incluso hasta de divertirnos con ella.
Por ejemplo, es la primera vez en mi vida que hago lo siguiente:
Using perl Syntax Highlighting
# 01234567890
my $cadena = '2009-11-02T00:00:00';
substr($cadena, 4
,1
) = substr($cadena, 7
,1
) = substr($cadena,10) = '';
print "$cadena\n";Coloreado en 0.001 segundos, usando
GeSHi 1.0.8.4
Lo mismo que antes, la explicación queda como ejercicio.