2

=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

}

これを実行しようとすると、次のエラーが発生します。

"my" 変数 $msg は、x.pl 行 16 で同じスコープ内の以前の宣言をマスクします。 x.pl 行 15 の構文エラー ") ) " x.pl 行 31 の構文エラー "}" の近く (暴走した複数行 << 25 行目から始まる文字列) x.pl の実行は、コンパイル エラーのために中止されました。

構文は問題ないように見えるので、理由はわかりません。

4

2 に答える 2

3

=20これらのインスタンスはメッセージの本文にあると思います。Mail :: Messageのドキュメントを少し読むと、次の役立つメモがわかります。

これにより、エンコードされる可能性のあるオブジェクトが返されることに注意してください。decode()を使用して、使用可能なデータを含む本文を取得します。

$msg->bodyしたがって、ループを呼び出す代わりに、を呼び出すだけ$msg->decoded->stringです。

以下を使用すると、並べ替えを実行するのが最も簡単になりますMail::Message::timestamp

...
for my $msg ( sort { $a->timestamp <=> $b->timestamp } $folder->messages) )
...
于 2008-12-15T13:07:18.507 に答える
0

QP本体をデコードするためのMIME::QuotedPrint::Perlモジュールを含むMIME ::Base64モジュールを確認することをお勧めします。

于 2008-12-15T13:05:40.757 に答える