2

次のエラーが発生するため、まだテストできていない次のコードを使用しようとしています。

#!/usr/bin/perl
use warnings;
use strict;
use Text::Wrap;
use Mail::Box::Manager;
use HTML::Obliterate qw(extirpate_html);


open (MYFILE, '>>data.txt');
binmode(MYFILE, ':encoding(UTF-8)');


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 ( sort { $a->timestamp <=> $b->timestamp } $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->decoded->string;


if ( $msg->isMultipart ) {
    foreach my $part ( $msg->parts ) {
        if ( $part->contentType eq 'text/html' ) {
          my $nohtml = extirpate_html( $msg );
$body =~ s/^>.*$//msg;
$Text::Wrap::columns=80;
print MYFILE wrap("", "", <<"");
\n
From: $from
To: $to
Date: $date
Subject: $subject
\n
$body
        }

else {


$body =~ s/^>.*$//msg;
$Text::Wrap::columns=80;
print MYFILE wrap("", "", <<"");
\n
From: $from
To: $to
Date: $date
Subject: $subject
\n
$body

}

}}

すべてのブレースが一致しているように見えるので、何が問題なのかわかりません

syntax error at x.pl line 46, near "else"
  (Might be a runaway multi-line << string starting on line 36)
Missing right curly or square bracket at x.pl line 63, at end of line
syntax error at x.pl line 63, at EOF
Execution of x.pl aborted due to compilation errors.

編集:

現在は機能していますが、html はストライプ化されていません。代わりに、
>
> のようなものが全体にインターレースされたいくつかの電子メールが、本来よりも多くのページに表示されています。これを行うより良い方法はありますか

4

2 に答える 2

4

したがって、36行目は

print MYFILE wrap("", "", <<"");

これは、perlがターミネータができるまで次のテキストをラップすることを意味します""(私はこのような紛らわしい項目を使用することはありません。簡単にするために常にENDまたはUNTIL_ENDを使用します)。

そのターミネータは45行目(空の行)にあります。つまり、次に処理するのは46行目です。

else {

if前のものはまだ閉じていないので、これは意味がありません(}がある44行目はターミネータの前に""あるため、折り返しのテキストとして扱われます。Perlはこれに気づき、これが原因である可能性があることを親切に示唆します。

(Might be a runaway multi-line << string starting on line 36)

""最初にターミネータ(空の行)を使用するには、行44と45を入れ替えてから、ifを。で閉じる必要があり}ます。例の2番目のラップは、これを正しく行います。

于 2008-12-16T15:39:10.243 に答える
1

変更された質問への回答:

メッセージ本文を削除する代わりに、メッセージ全体を削除します。そして、あなたはそれをどこにも使用しません。

my $nohtml = extirpate_html( $msg );
$body =~ s/^>.*$//msg;
$Text::Wrap::columns=80;
print MYFILE wrap("", "", <<"");
\n
From: $from
To: $to
Date: $date
Subject: $subject
\n
$body

おそらく、次のように変更する必要があります。

my $nohtml = extirpate_html( $body );
$nohtml =~ s/^>.*$//msg;

次に$nohtml、ラップのメッセージ本文として適用します。

于 2008-12-16T16:10:22.397 に答える