Как я могу отсортировать файл mbox по дате?

StackOverflow https://stackoverflow.com/questions/368271

  •  21-08-2019
  •  | 
  •  

Вопрос

Я хотел бы знать, как изменить приведенный ниже код, чтобы удалить =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.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top