typestar

log_parser.pl en Perl

Agrupa líneas de log por severidad con una sola regex de capturas con nombre.

use strict;
use warnings;

# log_parser: bucket log lines by level with a named-capture regex

my $log = <<'LOG';
2026-08-02 09:14:02 INFO  server started on port 8080
2026-08-02 09:14:05 INFO  connected to database
2026-08-02 09:15:11 WARN  slow query took 1200 ms
2026-08-02 09:16:40 ERROR connection reset by peer
2026-08-02 09:16:41 INFO  retrying in 2 s
2026-08-02 09:17:03 WARN  cache miss rate above 20 pct
2026-08-02 09:18:22 ERROR disk usage at 95 pct
LOG

my $pat = qr/^\S+ (?<time>\S+) (?<level>INFO|WARN|ERROR)\s+(?<msg>.+)$/;

my %by_level;
my @errors;

for my $line (split /\n/, $log) {
    next unless $line =~ $pat;
    my ($time, $level, $msg) = @+{qw(time level msg)};
    push @{ $by_level{$level} }, $msg;
    push @errors, "$time  $msg" if $level eq "ERROR";
}

print "lines by level:\n";
for my $level (sort keys %by_level) {
    printf "  %-5s %d\n", $level, scalar @{ $by_level{$level} };
}

print "errors:\n";
print "  $_\n" for @errors;

Cómo funciona

  1. qr// compila el patrón una sola vez; (?<level>...) nombra cada captura.
  2. Las coincidencias caen en %+, y una rebanada de hash desempaca time, level y msg.
  3. push @{ $by_level{$level} } agrupa los mensajes bajo su severidad.
  4. El reporte cuenta cada grupo y luego repite las líneas ERROR con sus horas.

Palabras clave y builtins usados aquí

El intento, en números

Líneas
34
Caracteres a escribir
942
Tokens
144
Ritmo de tres estrellas
85 tpm

Al ritmo de tres estrellas de 85 tokens por minuto, este intento toma unos 102 segundos.

Escribe este fragmento

Paso 3 de 3 en Bis; paso 27 de 27 en Fundamentos del lenguaje.

← Anterior