BBSを作っていて、勉強になったことが沢山ありすぎ。それに、ソースの書き方も少し変わってきた。
というわけで、「Jcode.pm」を正しい使い方(?)で使ってみた。ただ、この方法は「Jcode.pm」に書いてあるんだけど・・・。この機会に「jcode.pl」も色々な使い方で試してみた。
今まで、「Jcode.pm」を何気なく使用していたせいか、「jcode.pl」は使いにくい。「jcode.pl」はリファレンスを渡すはずなのに、変換されてないこともある。直接「print」できないというのも難点かなぁ・・・。使える条件がよくわからない。それに、「-w」オプションをつけると、「Use of uninitialized value」エラーがたくさん出る。使い方がよくないのかなぁ・・・?
「Jcode.pm」ならば、以下のように使っても正しく動作する。
foreach(@_){ print Jcode->new($_)->jis; }
foreach(@_){ print Jcode->new(\$_)->jis; }
foreach(@_){ print Jcode::convert($_, 'jis'); }
foreach(@_){ print Jcode::convert(\$_, 'jis'); }
ただ、「Jcode」は普通のプロバイダではインストールしてないだろうし、解凍したままの「Jcode」は約721KBもある。ユニコードを使えるということで肥大化してるみたいだけど・・・。
その点「jcode.pl」だと、ファイルが1つ(手元にあるのはCR,LF改行で、20,633バイト)で済む。それを考えると、「jcode.pl」を正しく使える方が有益なんだろうなぁ・・・。
話は変わって、連想配列。
連想配列は「ハッシュ」と呼ぶ方がいいようだ。配列と混同しやすいので、これからは「ハッシュ」と書く事にする。
代表的なハッシュは「%ENV」だ。今まで、ハッシュを定義する方法として「$hash{'hoge'} = "ほげ";」のような形式で代入する事しか知らなかった。
実はハッシュも配列と同じように、まとめて定義できる事がわかった。それは以下のようなもの。
# ハッシュの定義
%hash = ('hoge' => 'ほげ', 'geho' => 'げほ');
これで、「$hash{'hoge'}」は「ほげ」、「$hash{'geho'}」は「げほ」を示す事になる。なかなかかっこいい(笑)
また、ソースを書く場合、「;」が行の最後を表すので、「;」をつけなければ複数行に分けて書く事もできる。
# ハッシュの定義 その2
%hash = (
'hoge' => 'ほげ'
, 'geho' => 'げほ'
);
このサンプルCGIでは「タブ」と「改行」を使って整形しているけど、HTMLで表示するときに変換しているので、うまく整形されてない。ちなみに、普段は「スペース4文字」分で表示しているので、テキストとして表示しても、ブラウザでは「8文字」に変換されてしまうのでうまくない。残念だ。
また、引用符を使わなくても、ちゃんと認識してくれるようだ。例えば「$hash{hoge}」でも「ほげ」を示すことになる。「つけなくても動く」というだけで、つけた方が安全だとは思うけど・・・。でも、環境変数くらいなら、使わなくてもわかりやすいし、許してやってもいいかもしれない。
Perlは、色々な書き方ができるので、ソースに自分のスタイルがでるような気がしてきた。
あと、これからは不具合が無いかぎり、ソースは「sjis」だけでいく事にした。ファイル数が結構多くなってきたので、フォルダ内が見にくくなってきたから。
「euc」も良いんだけど、これだと普通のエディタで読めなくなってしまうから。「utf8」も、IEとNNで変換が違っていたり(例えば「?」がIEでは文字化けするとか)するし、なにより変換に時間がかかる。今のところあえて使う必要もない。
・・・
今回、ローカル環境から完全に移行するために「jcode.pl」に変更しました。なので、このスクリプトは無理やり実行してもほとんど意味がないので取りやめます。
ソースコード
#!/usr/bin/perl
#BEGIN{
# print "Content-type: text/plain\n\n";
# open(STDERR, ">&STDOUT");
# $|=1;
#}
$timeBegin = times;
unshift(@INC, "../..");# 「jcode.pl」のあるディレクトリ
require "jcode.pl";
use Jcode;
$info_mailName = 'Nobu3';
$info_mailAddr = 'nobu3@x.age.ne.jp';
$info_uriName = 'Incomprehensible Perl Project';
$info_uriAddr = 'http://www.age.ne.jp/x/nobu3/perl/';
$info_uri = qq(<a href="$info_uriAddr">$info_uriName</a>.);
$info_mail = qq((C)1999 - 2000 <a href="mailto:$info_mailAddr">$info_mailName</a>. All rights reserved.);
$info_copyright = "<address>\n<font face=times>$info_uri<br>\n$info_mail</font><br>\n</address>\n";
@usr_stylesheet = ('/Nobu3/ipp.css','../test.css');# できあがりからのURIパス
$usr_outcode = 'jis';
$usr_outCharset = 'iso-2022-jp';
$usr_title = 'テスト24';
$explain = $ENV{SCRIPT_NAME};
$explain =~ s|cgi/(ts[0-9]{4})(_[12u])?\.cgi$|$1\.htm|;
$explain_title = $usr_title . 'の解説';
%usr_links = (# リンクネーム => リンクアドレス
'Home' => '../../../index.htm'
, 'Perl' => '../../'
, 'TestCGI Index' => '../'
, $explain_title => $explain
);
{
printHeader($usr_title);
printBodyHeader($usr_title);
print "<div class=test>\n";
# require "dumpvar.pl"; dumpValue(\%usr_links);
print "Jcode $Jcode::VERSION<br>\n";
$japanese = "日本語に変換する文字列。<br>\n";
print useJcode($japanese);
print Jcode->new('これも日本語<br>')->jis;
$hoge = 'ほげほげほ?';
print Jcode::convert($hoge, $usr_outcode);
$geho = 'げほげほげ?';
print Jcode::convert(\$geho, $usr_outcode);
print $geho;
print "<br><br>\n";
print "jcode.pl $jcode::version<br>\n";
print usejcode($japanese);
print jcode::convert('これも日本語<br>', $usr_outcode);
$hoge = 'ほげほげほ?';
print jcode::convert($hoge, $usr_outcode);
$geho = 'げほげほげ?';
print jcode::convert(\$geho, $usr_outcode);
print $geho;
print "<br>\n";
print "</div>\n";
printFooter();
exit(0);
}
sub useJcode{
my($str)= @_;
return Jcode->new($str)->jis;
}
sub usejcode{
my($str) = @_;
jcode::convert(\$str, $usr_outcode);
return $str;
}
sub error{
my($err) = shift;
printHeader($err);
printBodyHeader($err.'です');
Jprint(@_);
printFooter();
exit(1);
}
sub printHeader{
# 「<title>タグ」の文字列
my($title) = @_;
print "Content-type: text/html; charset=$usr_outCharset\n\n";
print qq(<!doctype html public "-//W3C//DTD HTML 4.01 Transitional//EN">\n);
print "<html lang=ja>\n<head>\n";
print qq(<meta http-equiv="Content-type" content="text/html; charset=$usr_outCharset">\n);
print qq(<meta http-equiv="Content-style-type" content="text/css">\n);
Jprint("<title>$title</title>\n");
print qq(<link rev="made" href="$info_mailAddr">\n);
foreach(@usr_stylesheet){ print qq(<link rel="stylesheet" type="text/css" href="$_">\n); }
print qq(<meta name="ROBOTS" content="NOINDEX">\n);
print "</head>\n\n";
print "<body>\n\n";
}
sub printBodyHeader{
# 英字なら「printBodyHeader("<font face=times>Title String</font>");」がいい
my($title) = @_;
print "<div align=center>\n";
Jprint(qq(<h1><a name="top">$title</a></h1>\n<hr>\n));
printLinks();
print "</div>\n";
}
sub printFooter{
print "<div align=center>\n";
print qq(<a href="#top">Top</a>\n<hr>\n);
printLinks();
print "</div>\n";
print "\n<div align=right>\n";
$timeEnd = sprintf("%.3f", times - $timeBegin);
print "Cost : $timeEnd<br>\n";
print $info_copyright;
print "\n</body>\n</html>\n\n";
}
sub printLinks{
my $cnt = 0;
foreach(keys %usr_links){
print "/ " if($cnt++);
Jprint(qq(<a href="$usr_links{$_}">$_</a>\n));
}
print "<hr>\n";
}
sub Jprint{
foreach(@_){
my $tmp = $_;
jcode::convert(\$tmp, $usr_outcode);
print $tmp;
}
}
