作者: dune
日時: 2002/7/07(20:18)
極悪です。

藤岡和夫 さんの [TSperl:103] Re: MLの内容を個人のホームページに から
> 見せていただきましたが、私は特に問題ないと思いますけど。

ありがとうございます。



以下はおまけで、今回データの切り出しのために書いたスクリプト。
ヘッダ部分と本文部分の間を行き来するステートマシンになってます。
\x2E がメール一件一件の境界になっていて、分解して一件一ファイル
に保存します。

--^hoge.pl
use Jcode;
use MIME::Words qw(:all);
use strict;

my(%id,%tree,%title);
my($date,$from,$re_id,$id,$mailer,$subject,$body,$no);
my $statemach   = q(header);
my $quot        = qq(\n----\nこのページはメーリングリスト TSnet/TSperl の内容を極悪が転載したものです。);

while(<>){
    if($statemach eq q(header)){
        $_  = decode_mimewords($_);

        if(m/^Date: (.+)$/){            $date   = $1;   next    }
        if(m/^From: (.+)$/){            $from   = $1;   next    }
        if(m/^In-Reply-To: <(.+)>$/){   $re_id  = $1;   next    }
        if(m/^X-Mailer: (.+)$/){        $mailer = $1;   next    }
        if(m/^Message-Id: <(.+)>$/){    $id     = $1;   next    }
        if(m/^From: (.+)$/){            $from   = $1;   next;   }
        
        if(m/^Subject: (\[TSperl:\d+\]) (.+)$/){
            $no         = $1;
            $subject    = $2;
            next;
        }

        if(m/^$/){
            $statemach  = q(body);
            undef $body;
            next;
        }

    }elsif($statemach eq q(body)){

        if(m/^\x2E$/){
            $statemach  = q(header);

            $id{$id}    = $no;
            $title{$id} = qq($no $subject / $from);
            $body       =~ s/^\n+//;
            $body       =~ s/\n+$//;
            1 while($body =~ s/^(>+) >/$1>/mg);

            my $output  = q(http://homepage1.nifty.com/dune/img/tslogo.png)."\x20";
            $output     .= "http://rakunet.org/TSNET/\n";
            $output     .= "subject :$subject\n";
            $output     .= "date    :$date\n";
            $output     .= "from    :$from\n";
            $output     .= "mailer  :$mailer\n";
            if(exists $id{$re_id}){
                $output     .= "reply-to:$id{$re_id}\n";
            }else{
                $output     .= "top-menu:<[TSperl]>\n";
            }
            $output     .= "\n";
            $output     .= "----\n";
            $output     .= "\n";
            $output     .= "$body\n";
            $output     .= "\n\n\n";
            Jcode::convert(\$output,'sjis','jis',"z");
            $output =~ s/([\w\.\-]+)@([\w\.\-]+\.[\w\.\-]+)/$1@... /g;
            
            $no =~ m/\[(.+):(.+)\]/;
            my $file = "TSperl/%5B$1%3A$2%5D.hdb";
            open(FILE,">$file") or die;
            print FILE $output;
            print FILE $quot;
            close FILE;
            
            if($re_id){
                if(exists $tree{$re_id}){
                    $tree{$re_id}   = [@{$tree{$re_id}},$id];
                }else{
                    $tree{$re_id}   = [$id];
                }
            }else{
                if(exists $tree{root}){
                    $tree{root}     = [@{$tree{root}},$id];
                }else{
                    $tree{root}     = [$id];
                }
            }
            
            ($date,$from,$re_id,$id,$mailer,$subject,$body,$no) = ();
            next;
        }

        $body   .= $_;
    }
}

my $output  = q(http://homepage1.nifty.com/dune/img/tslogo.png)."\x20";
$output     .= "http://rakunet.org/TSNET/\n";
sub tree{
    my @list    = @{$_[0]};
    my $level   = " " x $_[1];
    $level      .= " " if 1 < $_[1];
    foreach(@list){
        $output .= "$level$title{$_}\n";
        tree($tree{$_},$_[1]+1) if exists $tree{$_};
    }
}
tree([reverse @{$tree{root}}],1);
Jcode::convert(\$output,'sjis','jis',"z");
$output =~ s/([\w\.\-]+)@([\w\.\-]+\.[\w\.\-]+)/$1@... /g;
my $file = "TSperl/%5BTSperl%5D.hdb";
open(FILE,">$file") or die;
print FILE $output;
print FILE $quot;
close FILE;
--$
-- 
FZH01112@..., http://homepage1.nifty.com/dune/