ファイルの出力の応用(?)と、「Location」でページを移動する練習です。
とりあえず出力は「ISO-2022-JP」で。でも、「Shift_JIS版」では、「のソース」が文字化けしている。なおすのは簡単(“のソース"か、‘のソース’と書けばなおるはず)だけど、そのままにしておく。
HTML形式で出力しているから、IEでもちゃんと表示されるはず。ついでだから、行番号も入れておいた。ただ、両方を試すと「ts0011.htm」がブラウザのキャッシュに残るはずなので、表示後にはリロードが必要です。
これを少し応用すれば、ディレクトリ内のcgiファイルをHTMLに変換することも簡単にできる。ただ、単純なテキストファイルよりも、サイズが大きくなるのが欠点か・・・。
ついでなので、ソースを見るCGIスクリプトを作って、このファイルから適用することにした。スクリプト自体を「EUC」にしたから、文字化けはしないはずだけど・・・。
次に、「Location」について。
perl(CGI?)では、「print」するときに、何を出力するのかをまず書く必要があるようだ。例えば、HTMLとして画面に出力するには「Content-type: text/html」をまず最初に出力する必要がある。しかも、その後には空行が必要らしい。
そもそも、「print」というのはブラウザに対して出力するのだから、HTMLファイルを読むときと同じように出力する必要があるのかもしれない。よくわからないけど。
で、「Location」はLocation: http://www.hoge.ne.jp/hoge/
のように出力する。これも、空行を書かないとブラウザが正しく処理してくれない。具体的にはprint "Location: http://www.hoge.ne.jp/hoge/\n\n";
と書く必要がある。URLの指定は、絶対指定(http://...
)だけでなく、相対指定も使えるようだ。
また、大文字小文字も判別するようで、「location」と書いてしまうと、これもうまくいかない。サーバとブラウザの間では、シビアな約束事があるようだ。
出力したCGIスクリプトの文字コードを出力するように訂正した。
「txt」ディレクトリを削除するため、出力先を変更した。ついでに、「<code>
タグ」を追加したり、出力先を変数に格納したりなどの変更時の簡素化をはかってみた。
ソースコード
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
|
#!/usr/bin/perl
# require Jcode;
# *Jgetcode = &Jcode::getcode;
# *Jconvert = &Jcode::convert;
require "../../../cgi-bin/jcode.pl";
*Jgetcode = &jcode::getcode;
*Jconvert = sub { &jcode::to($_[1], $_[0], $_[2]); };
$file = "ts0011";
$outfile = "$file.htm";
$infile = "$file.cgi";
$title = "$infileのソース";
$fcode = "sjis";
$mycode = &Jgetcode("漢字");
$cutcode = "jis";
$title .= "($mycodeから出力)";
{
open(OUT, "> $outfile");
&printHeader;
print (OUT "<ol>");
open(IN, $infile);
while($line = <IN>){
$line =~ s/&/&/g;
$line =~ s/"/"/g;
$line =~ s/</</g;
$line =~ s/>/>/g;
$line =~ s/ / /g;
&Jfprint ("<li><code>$line</code>");
}
close(IN);
print (OUT "</ol>");
&printFooter;
close(OUT);
print "Location: $outfilenn";
exit;
}
sub printHeader{
&Jprint ("<html lang=ja><head><title>$title</title>n");
print (OUT "</head><body>n");
&Jprint ("<h1>$title</h1><hr>n");
}
sub printFooter{
print (OUT "<hr>n");
print (OUT "</body></html>n");
}
sub Jprint{
foreach (@_) {
print (OUT &Jconvert($_, $cutcode, $mycode));
}
}
sub Jfprint{
foreach (@_) {
print (OUT &Jconvert($_, $cutcode, $fcode));
}
}
|