2008-12-15 112 views
2

我想知道如何修改下面的代碼去除多行尾部的=20個字符,主要是按照時間順序從最初接收到的或發送到最後的時間對消息進行排序。我不確定這是否是一個內部的Perl例程。如何按日期排序mbox文件?

#!/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 

} 

當試圖運行此我得到以下錯誤:

在同一範圍內「我的」變量$味精口罩早些時候的聲明在x.pl線在x.pl 15行16 語法錯誤,「near」))「 語法錯誤在x.pl行31附近,」}「 (可能是失控的多行< <字符串從第25行開始) 由於編譯錯誤導致執行x.pl中止。

我不確定爲什麼,因爲語法看起來不錯。

+0

重複http://stackoverflow.com/questions/368003/how-can-i-reorder-an-mbox-file-chronologically – Bombe 2008-12-15 13:03:10

+0

的不,這是Perl的,更具體的 – 2008-12-15 13:03:42

回答

3

我猜那些=20的實例在消息的正文中。閱讀只是有點的documentation for Mail::Message的,就會發現這是很有幫助的。注意:

警告說,這將返回你可以編碼的對象:使用解碼()來得到一個體可用數據。

因此,不要在循環中調用$msg->body,只需致電$msg->decoded->string即可。

完成排序,當您使用Mail::Message::timestamp應該是最簡單的:

... 
for my $msg (sort { $a->timestamp <=> $b->timestamp } $folder->messages)) 
... 
0

我建議你看看MIME::Base64模塊,其中包括MIME :: QuotedPrint :: Perl模塊,解碼QP機構。