Почему HTML :: Obliterate не уничтожает мой HTML? - PullRequest
2 голосов
/ 16 декабря 2008

Я пытаюсь использовать следующий код, который я еще не смог протестировать, потому что я получаю следующие ошибки:

#!/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 не является полосатым: вместо этого несколько писем с такими вещами, как
>
>, чередуются повсюду, в результате чего страницы становятся намного больше, чем должны. Есть ли лучший способ сделать это

Ответы [ 2 ]

4 голосов
/ 16 декабря 2008

Таким образом, строка 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 с помощью }. Второй перенос в вашем примере делает это правильно.

1 голос
/ 16 декабря 2008

Ответ на ваш измененный вопрос:

Вместо того, чтобы уничтожать тело сообщения, вы уничтожаете все сообщение целиком. И тогда вы нигде его не используете.

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 в качестве тела сообщения для переноса.

...