Как я могу отсортировать файл mbox по дате? - PullRequest
2 голосов
/ 15 декабря 2008

Я хотел бы знать, как изменить приведенный ниже код для удаления символов =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. синтаксическая ошибка в строке 15 x.pl, рядом с "))" синтаксическая ошибка в строке 31 x.pl, рядом с "}" (Может быть бегущей многострочной << строкой, начинающейся на строке 25) Выполнение x.pl прервано из-за ошибок компиляции. </p>

Я не уверен, почему, поскольку синтаксис выглядит нормально.

Ответы [ 2 ]

3 голосов
/ 15 декабря 2008

Я предполагаю, что эти экземпляры =20 находятся в теле сообщения. Чтение небольшой части документации для Mail :: Message покажет это полезное примечание:

ВНИМАНИЕ, что это возвращает вам объект, который может быть закодирован: используйте decoded () для получения тела с пригодными для использования данными.

Таким образом, вместо вызова $msg->body в вашем цикле, просто вызовите $msg->decoded->string.

Выполнение сортировки должно быть максимально простым при использовании Mail::Message::timestamp:

...
for my $msg ( sort { $a->timestamp <=> $b->timestamp } $folder->messages) )
...
0 голосов
/ 15 декабря 2008

Я бы предложил взглянуть на модуль MIME :: Base64 , который включает в себя модуль MIME :: QuotedPrint :: Perl для декодирования тел QP.

...