#!/usr/local/bin/perl -w # sortem - Sortowanie poczty # (C) 2000 Marcin Owsiany #use Date::Parse; use Time::Local; my @tmpd; # tymczasowo przechowuje maila my %tmpi; # mozliwe klucze my %mails; # ( $key => \@mail, ... ) my $MODE; my $debug = 1; my %month = ( 'Jan' => '1', 'Feb' => '2', 'Mar' => '3', 'Apr' => '4', 'May' => '5', 'Jun' => '6', 'Jul' => '7', 'Aug' => '8', 'Sep' => '9', 'Oct' => '10', 'Nov' => '11', 'Dec' => '12', ); my $opcja = shift; if ($opcja eq '-s') { $MODE = 'subject'; } elsif ($opcja eq '-n') { $MODE = 'from'; } elsif ($opcja eq '-d') { $MODE = 'date'; } else { print STDERR "Nieprawidłowa opcja\n"; exit 1; } # niestety na studencie nie ma modulu Date::Parse, # wiec musze parsowac date recznie sub parse_date { ($date) = @_; if ($date =~ /.*\s+(\S+)\s+(\d+)\s+(\d+):(\d+):(\d+)\s+(\d+)/) { # month day hour minute sec year # $time = timelocal($sec,$min,$hours,$mday,$mon,$year); return timelocal($5, $4, $3, $2, $month{$1}, $6); } else { print STDERR "Nieczytelna data $date\n"; return 9000; } # return str2time($_); } # zapisanie maila z @tmpd do %mails sub finish_previous { # na przyklad jesli sortuje wedlug tematow, # a list nie zawiera pola Subject: $tmpi{$MODE} = '' unless defined($tmpi{$MODE}); foreach $line (@tmpd) { push @{$mails{$tmpi{$MODE}}}, $line; } } while (<>) { if (/^From\s+\S+\s+(.*)$/) { finish_previous if @tmpd; @tmpd = (); %tmpi = (); $tmpi{'date'} = parse_date $1; push @tmpd, $_; } else { if (/^From\s*:\s*(.*)/) { # from/subject ustawiamy tylko, jesli jeszcze tego # nie zrobilismy (list moze zawierac kilka pol # From: lub Subject:) $tmpi{'from'} = $1 unless $tmpi{'from'}; } elsif (/^Subject\s*:\s*(Re:|RE:|Odp:|FWD:|Fwd:|PD:|Pd:|\s+)*\s*(.*)/) { $tmpi{'subject'} = $2 unless $tmpi{'subject'}; } # dodanie linii push @tmpd, $_ if @tmpd; } } finish_previous if @tmpd; # wybor sortowania - wg porzadku leksykograficznego lub liczbowego if ($MODE eq 'date') { @gotowa = sort { $a <=> $b } keys %mails; } else { @gotowa = sort keys %mails; } # drukowanie posortowanych listow foreach (@gotowa) { print @{$mails{$_}}; }