Bienvenido a los foros de Perl en Español, JuanMan.
Hay un problema en la exp. reg. tuya: si analizamos las decenas de la parte de las horas, podemos pensar que puede ser 0, 1, o 2. Pero, en las unidades, podemos esperar de 0 a 9 SALVO si en las decenas tenemos un '2', que entonces esperamos un valor entre 0 y 3. Para la parte de minutos lo tenemos un poco más fácil.
Hay varias formas de solucionarlo, claro.
Lo mejor es hacerlo varias partes.
Using perl Syntax Highlighting
if ( ($h,$m) = /(\d+):(\d+)/ ) {
print if $h > 23
or $m > 59;
}Coloreado en 0.001 segundos, usando
GeSHi 1.0.8.4
Queda más claro y además añades la comprobación de que la línea contiene una 'posible' hora (con el primer if).
Si aún así quieres hacerlo en una sola línea, la expresión regular es un poco más complicada de lo normal:
Using perl Syntax Highlighting
while ( <IN> ) {
print if /(\d+)(?{ $^N > 23 }):(\d+)(?{ $^R or $^N > 59 })/ and $^R;
}
Coloreado en 0.001 segundos, usando
GeSHi 1.0.8.4
La expresión regular es la misma que antes (captura de dígitos con \d+) pero agregando secuencias de código (
(?{})) en la que comprobamos que lo recién capturado (
$^N) está dentro de los límites. El resultado de esa comprobación va quedando en la variable especial
$^R. El if ejecuta primero la exp. reg. El resultado queda en
$^R que quedará como verdadero si alguna de las partes está fuera de los límites. En ese caso, el 'and' evalúa la segunda parte que será cierta si
$^R es cierta. Total, que el if será cierto según el valor final de
$^R, indicando si sí o no es incorrecta la hora. Si es incorrecta, imprime el valor de
$_.