use strict; use warnings; use Time::Local; use 5.010; my %seen; my %months = ( Jan => 1, Feb => 2, Mar => 3, Apr => 4, May => 5, Jun => 6, Jul => 7, Aug => 8, Sep => 9, Oct => 10, Nov => 11, Dec => 12, ); open my $fh, "<", "phperrors.log" or die $!; my @lines; while (my $line = <$fh>) { chomp $line; if ($line =~ /error/) { unless ($seen{ $line }++) { if ($line =~ m/^\[(\d{2})-(\w{3})-(\d{4}) (\d{2}):(\d{2}):(\d{2})\]/) { my ($day, $monthname, $year, $hour, $minute, $sec) = ($1, $2, $3, $4, $5, $6); my $month = $months{ $monthname } - 1; my $epoch = timelocal($sec, $minute, $hour, $day, $month, $year); push @lines, [$epoch, $line]; } } } } @lines = map { $_->[1] } sort { $a->[0] <=> $b->[0] } @lines; say for @lines;