Perlについて

95ブログに投稿する際、後ろでいろいろやっているのがPerlです。
そのPerlのソースを行ごとに解説していきます。

ソースはコチラ(txtファイルにしてあります)

以下も同じものです。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169

#!/usr/local/bin/perl
require '/bin/mimer.pl';
require '/bin/mimew.pl';
require '/bin/jcode.pl';
$changed='abcded0@mo.judem.jp';
$changed2='abcde@yaboo.co.jp';
open(DEBUG,">>/bin/DEBUG.txt");
$file="/bin/mail$$.txt";
open(MAIL,">$file");
while ( <STDIN> ) { # header
print DEBUG "-$_-\n";
chomp;
if ( /^$/ ){ # end of header
print MAIL "To: $changed\n";
&print_cooked_subject();
print MAIL "\n";
last;
}elsif( /^To:/ ){
s/^To:/X-Original-To:/i;
print "$_\n";
}elsif( /^Subject:[ \t]+(.*)/i ){ # subject
print MAIL "X-Oiginal-$_\n";
$subject=$1;
$sub_c = 1;
}elsif( (/^From:.*clubbbq/i) ){ # From
exit;
}elsif( /^[ \t]+(.*)/ && $sub_c ) { # subject continued
$subject.=" ". $1;
}else{
$sub_c = undef; # other lines
print MAIL "$_\n";
}
}
while ( <STDIN> ) { # body
print MAIL "$_";
}
close(MAIL);

system("/usr/lib/sendmail $changed <$file");
system("/usr/lib/sendmail $changed2 <$file");

unlink($file);
exit;
sub print_cooked_subject(){
$_ = $subject;
$_ = &mimedecode($_);
$_ = &jcode::euc($_);
&zen2han();
print DEBUG "-$_-\n";
( $sec, $min, $hour, $date, $mon, $year, $wday ) = localtime;
$year += 1900;
$mon++;
print DEBUG "$year,$mon,$date\n";
if(length($mon)==1){
$mon = "0" . $mon;
}
if(length($date)==1){
$date = "0" . $date;
}
$today = $mon . $date;
print DEBUG "$today\n";
$sub = $_;
if($sub=~/^k(\d\d\d\d)/){
$a = "$1";
print DEBUG "-$a-\n";
$sub =~ s/^.....(.*)$/$1/;
$sub = $1;
print DEBUG "$sub\n";
if($a < $today){
$year++;
print DEBUG "$year,$a\n";
}
elsif($a >= $today){
print DEBUG "$year,$a\n";
}
if($a =~/(\d\d)(\d\d)/){
print DEBUG "$a\n";
$Subject = "休講" . $year . "/" . $1 . "/" . $2 . $sub;
}
}
elsif($sub=~/^(\d\d\d\d)/){
$a = "$1";
print DEBUG "-$a-\n";
$sub =~ s/^....(.*)$/$1/;
$sub = $1;
print DEBUG "$sub\n";
if($a < $today){
$year++;
print DEBUG "$year,$a\n";
}
elsif($a >= $today){
print DEBUG "$year,$a\n";
}
if($a =~/(\d\d)(\d\d)/){
print DEBUG "$a\n";
$Subject = "休講" . $year . "/" . $1 . "/" . $2 . $sub;
}
}
elsif($sub=~/^h(\d\d\d\d)/){
$a = "$1";
print DEBUG "-$a-\n";
$sub =~ s/^.....(.*)$/$1/;
$sub = $1;
print DEBUG "$sub\n";
if($a < $today){
$year++;
print DEBUG "$year,$a\n";
}
elsif($a >= $today){
print DEBUG "$year,$a\n";
}
if($a =~/(\d\d)(\d\d)/){
$Subject = "補講" . $year . "/" . $1 . "/" . $2 . $sub;
}
}
else{
$Subject = $sub;
}
$Subject = &mimeencode($Subject);
print MAIL "Subject: $Subject\n";
}
sub zen2han(){
s/0/0/g;
s/1/1/g;
s/2/2/g;
s/3/3/g;
s/4/4/g;
s/5/5/g;
s/6/6/g;
s/7/7/g;
s/8/8/g;
s/9/9/g;
s/A/A/g;
s/B/B/g;
s/C/C/g;
s/D/D/g;
s/E/E/g;
s/F/F/g;
s/G/G/g;
s/H/H/g;
s/I/I/g;
s/J/J/g;
s/K/K/g;
s/L/L/g;
s/M/M/g;
s/N/N/g;
s/O/O/g;
s/P/P/g;
s/Q/Q/g;
s/R/R/g;
s/S/S/g;
s/T/T/g;
s/U/U/g;
s/V/V/g;
s/W/W/g;
s/X/X/g;
s/Y/Y/g;
s/Z/Z/g;
s/T/l/g;
s/U/ll/g;
s/V/lll/g;
s/W/lV/g;
s/X/V/g;
s/Y/Vl/g;
s/Z/Vll/g;
s/[/Vlll/g;
s/\/lX/g;
s/]/X/g;
}

1:Perlの場所を指定
2~4:メールのヘッダや本文に文章を書く際のエンコードするもの
5~6:このPerlで書き出したメールを送信する宛先(この場合は2つある)
7:デバッグ用にDEBUG.txtを用意している
8:$fileという名前にmail$$.txtのパスを当てている
9:受信したメールを$fileに書き出している
10~33:ヘッダの処理をしている
 25~26:Fromにclubbbqという文字が入っていたらメールを送信しない
 ようにしている(広告メールが記事に反映されるのを防止している)
34~36:本文の処理をしている(そのままメールに書き出している)
39~40:メールをそれぞれに送信
44~169:15行目で処理をするサブルーチン
 50:現在の年月日時を取得している
 51:1900を加えて現在の西暦に合わせている
 52:月は1月を02月を1で返すため、1を加えて合わせている
 54~56:月が1桁なら頭に0をつけるようにしている(2月→02)
 57~59:日が1桁なら頭に0をつけるようにしている(7日→07)
 60:日付を4桁の数字にしている(2月7日→0207)
 62:$subの中にメールに書かれた件名を入れている
 63~80:件名の最初にk****(*は1桁の自然数)と書かれている場合
 の処理をしている
  66~67:k****の後に書かれた文字(ここでは授業科目名)を
   $subの中に入れている
  69~72:k****の****にあたる4桁の自然数が60で作った数より
   小さければ、$yearに1を加えている
  73~75:上に当てはまらなければ、$yearはそのまま
  76~79:月に当たる数字と日に当たる数字をそれぞれマッチさせて
   $Subjectとしてメールを送信するときに使う件名の形を決めている
  (0207情報A→休講20XX/02/07情報A)
 81~98:件名の最初に****(*は1桁の自然数)と書かれている場合
 の処理をしている(処理内容は上とほぼ同じ)
 99~115:件名の最初にh****(*は1桁の自然数)と書かれている場合
 の処理をしている(処理内容は上とほぼ同じだが休講の部分が補講になる)
 122~158:全角で書かれた英数字を半角に直している
 159~168:ローマ数字のような機種依存文字を半角英字を使って直している
 (T→l X→V ]→X)