Как я могу отсортировать файл mbox по дате?
Вопрос
Я хотел бы знать, как изменить приведенный ниже код, чтобы удалить =20
символы в конце многих строк и главным образом для сортировки сообщений в хронологическом порядке от первых полученных или отправленных до последних.Я не уверен, будет ли это внутренняя процедура Perl или нет.
#!/usr/bin/perl
use warnings;
use strict;
use Mail::Box::Manager;
my $file = shift || $ENV{MAIL};
my $mgr = Mail::Box::Manager->new(
access => 'r',
);
my $folder = $mgr->open( folder => $file )
or die "$file: Unable to open: $!\n";
for my $msg ($folder->messages)
{
my $to = join( ', ', map { $_->format } $msg->to );
my $from = join( ', ', map { $_->format } $msg->from );
my $date = localtime( $msg->timestamp );
my $subject = $msg->subject;
my $body = $msg->body;
# Strip all quoted text
$body =~ s/^>.*$//msg;
print <<"";
From: $from
To: $to
Date: $date
$body
}
При попытке запустить я получаю следующие ошибки:
«Моя» переменная $msg маскирует предыдущее объявление в той же области действия в строке 16 x.pl.Ошибка синтаксиса в строке X.pl Line 15, Near "))" Синтаксическая ошибка в строке x.pl 31, рядом "}" (может быть сбежавшей многострочной << строка, начиная с строки 25). к ошибкам компиляции.
Я не уверен, почему, поскольку синтаксис кажется нормальным.
Решение
Я предполагаю, что эти случаи =20
находятся в теле сообщения.Прочитав лишь немного документация для Mail::Message покажет это полезное примечание:
ВНИМАНИЕ, что это возвращает вам объект, который может быть закодирован:используйте decoded(), чтобы получить тело с пригодными для использования данными.
Таким образом, вместо вызова $msg->body
в вашем цикле просто позвоните $msg->decoded->string
.
Выполнение сортировки должно быть проще всего при использовании Mail::Message::timestamp
:
...
for my $msg ( sort { $a->timestamp <=> $b->timestamp } $folder->messages) )
...
Другие советы
Я бы предложил посмотреть МИМЕ::Base64 модуль, который включает модуль MIME::QuotedPrint::Perl для декодирования тел QP.