Por lo que veo, tanto en
$filename_regexp como en
$currfile_regexp hay un par de paréntesis de captura, opcional, y que nunca compruebas su existencia:
(\.\w+\.\d+)? por lo que suponemos que no te interesa (a lo largo del programa no compruebas el valor de
$1).
Como los casos que nos interesa obviar son 'especiales' por valer "00000000000", podemos aprovechar esa circunstancia para ahorrar un poco de escritura, al poder usar el valor de verdad de un valor que es cero. Atención, "00000000000" es un valor verdadero en Perl. "0" o 0 sí que es falso en Perl.
Si suponemos que tenemos esta entrada:
- Código: Seleccionar todo
STAT_12345678_123456.palabra.123.01.0010002000_0020002100
STAT_12345678_123456.palabra.123.02.0010002000_0020002100
STAT_12345678_123456.palabra.123.03.0000000000_0000000000
STAT_12345678_123456.04.0010002000_0020002100
STAT_12345678_123456.05.0000000000_0000000000
STAT_12345678_123456.palabra.123.06
STAT_12345678_123456.07
el siguiente código
Using perl Syntax Highlighting
#!/usr/bin/perl
use strict
;
use warnings
;
my $filename_regexp = qr/
^STAT_
# Cabecera
\d{8
}
_
\d{6
}
(?:\
.\w+\
.\d+)? # Parte opcional
\
.
\d{2
}
(?:| # La parte final puede no existir
\
.
(\d+) # $1
_
(\d+) # $2
)
$
/x
;
open my $file, '<', 'kk.txt';
my @files =
sort
grep { /$filename_regexp/ and defined $1 and 0+$1 and defined $2 and 0+$2 }
<$file>;
close $file;
undef $";
print "@files";Coloreado en 0.002 segundos, usando
GeSHi 1.0.8.4
genera la salida filtrada
- Código: Seleccionar todo
STAT_12345678_123456.04.0010002000_0020002100
STAT_12345678_123456.palabra.123.01.0010002000_0020002100
STAT_12345678_123456.palabra.123.02.0010002000_0020002100
Explicación.
* Hemos 'estirado' la expresión con la ayuda de la opción
/x para poder hacerla un poco más clara, y con comentarios.
* Dentro de ella, hemos convertido en paréntesis de NO captura aquellos que no nos interesan más tarde.
* La parte final de la expresión regular es esta:
(?:|\.(\d+)_(\d+)), que quiere decir que hay dos opciones, separadas por '|'. En la primera opción, no hay nada, mientras que en la segunda, están las dos ristras de números a capturar. Todo está metido en un par de paréntesis de no captura (
(?:...)) porque sólo nos interesa capturar los dos valores finales, no todo.
* En el bucle de filtrado, hacemos sort y grep en la misma línea.
* El filtrado es, aparte de la expresión regular y comprobar la existencia de $1 y $2, ver si esos valores son ciertos (son distintos de cero). Para ello, los convertimos de secuencias de dígitos a número, con sólo sumarles un 0. El resultado que nos interesa es que, justamente, sean distintos de cero.