use 5.028; use strictures; use autodie; use Sys::Mmap qw(mmap PROT_READ MAP_SHARED); my ($approach, $file) = @ARGV; my $str; if ('perlio' eq $approach) { open my $fh, '<:mmap', $file; local $/; $str = readline $fh; } else { open my $fh, '<', $file; mmap($str, 0, PROT_READ, MAP_SHARED, $fh) or die "mmap: $!"; }; my $mon = join '|', qw(Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec); my $pattern = qr" ^ <(?'pri' \d{1,3} )> (?'mon' $mon ) [ ] (?'day' (?: [ ]\d | \d\d ) ) [ ] (?'time' \d\d:\d\d:\d\d ) [ ] (?'host' [^ ]+ ) [ ] (?'msg' [^\n]+ ) $ "amosx; while ($str =~ /$pattern/g) { () = %+; # do something useful with the results };