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
qr//compila el patrón una sola vez;(?<level>...)nombra cada captura.- Las coincidencias caen en
%+, y una rebanada de hash desempacatime,levelymsg. push @{ $by_level{$level} }agrupa los mensajes bajo su severidad.- El reporte cuenta cada grupo y luego repite las líneas
ERRORcon sus horas.
Palabras clave y builtins usados aquí
forifkeysmynextprintprintfpushscalarsortsplitunlessuse
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.
Paso 3 de 3 en Bis; paso 27 de 27 en Fundamentos del lenguaje.