プログラム改造の基礎知識

プログラム改造の基礎知識

Perlについて

Web Liberty を含む多くのWebサイトで配布されているCGIは、Perl(パール)と呼ばれるプログラミング言語で書かれています。

Perl とは、Practical Extraction and Report Language の略称です。…と多くの書籍で紹介されていますが、本来は真珠(pearl)が元になっているらしいです。

まあ、そんな話はここではどうでもいいのですが(^^;知っておいて損は無いでしょう。

改造に使用するエディタについて

CGIの編集はテキストエディタで行います。

Windowsに付属しているメモ帳で改造・編集する事も可能ですが、機能が乏しくCGIの編集には向いていません。行番号が表示されない、元に戻すでさかのぼれる回数が1回しかない、サイズの大きいファイルを開く事ができない など、不便な点が多いです。できればもっと高機能なエディタを入手しましょう。

ちなみに、CGIはHTMLとは別物です。HTMLエディタで編集することはできません。

僕は現在、TeraPadというエディタを使用しています。使いやすい上にフリーソフトなのでお勧めです。

改造するファイルについて

改造・編集するファイルは、基本的に拡張子が .cgi.pm.html のファイルです。拡張子が .cgi のファイルと .pm のファイルがプログラムファイル、.html のファイルはスキンファイル(デザイン定義ファイル)となります。

スキンファイルは記述ミスがあってもレイアウトが崩れる程度ですが、プログラムファイルに記述ミスがあると全く動作しなくなる可能性があります。プログラムを編集する際は、特に慎重に編集してください。

全角文字と半角文字について

プログラムは半角文字で記述しなければなりません。全角文字で記述するとエラーになります。

ただし、表示する文字列やコメント(プログラムの注釈)部分は基本的にどの文字を使っても大丈夫です。このあたりは、HTMLファイルに通常の文章を書く時と同じ関係です。

プログラムのインデントについて

Perlはフリーフォーマットで記述する事が許されています。つまり、HTMLと同様に後々読みやすいように半角スペースやタブでインデントを調節する事ができます。ただしインデントに全角スペースを使用するとエラーになるので注意が必要です。

以下に例を挙げます。2つのプログラムはまったく同じ意味です。

#プログラム1
for ($i = 0; $i < 10; $i++) {
    if ($i == 5) {
        print "\$i is 5\n";
    } else {
        print "\$i is not 5\n";
    }
}
#プログラム2
for ($i=0;$i<10;$i++) {
if ($i==5) {
print "\$i is 5\n";
} else {
print "\$i is not 5\n";
}
}

自分が読みやすいと思ったフォーマットにする事ができます。「プログラムをコピーしたけどインデントもきっちり他とあわせなければいけないの?」と、思う事があるかもしれませんが、気にする必要はありません。

ちなみに、普通は上の『プログラム1』のようにインデントを付けて書きます。「どっちも変わらない。」という方は気にせずに書いてください。(^^;

文字列の出力について

文字列を表示する方法はいくつかあります。よく利用される方法は

print "文字列を出力";

と記述することです。これで画面に『文字列を出力』と表示することができます。ですが、この方法だと

print "<font color="#FF0000">文字列</font>を出力";

とダブルクォートを含む文字列を表示しようとするとエラーになります。print "~"; の場合、"" にはさまれた文字列を表示せよ。という意味になるので「print "<font color=" は理解できるけど、後に続く文字は何だ?」と解釈されてしまいます。この場合、

print "<font color=\"#FF0000\">文字列</font>を出力";

のように "\" と記述すればエラーは出なくなります。\ はエスケープ文字と呼ばれるものです。この文字に続く文字は特別な意味を持つようになり、通常の文字とは別物として扱われます。また、

print qq|<font color="#FF0000">文字列</font>を出力|;

という方法もあります。この場合 \" と記述する必要が無いため、HTML文章を出力するには便利です。| を含む文字列を表示する場合はやはり | をエスケープする必要がありますがHTML文章で | を表示する機会はほとんど無いため、実際にはエスケープを全くしなくてもいい状態になります。

もう一つ、ヒアドキュメントと呼ばれる出力方法があります。具体的には

print <<"_HTML_";
文字列を出力
_HTML_

となります。上記の場合、print <<"_HTML_"; から _HTML_ の間に記述した文字列がすべて出力されます。1行ごとに print と書かなくていいため、表示したい文字列が何行にも渡る場合は便利です。なお

print <<"_HTML_";
文字列を出力
	_HTML_

と、_HTML_ の前に空白やタブを挿入してはいけません。print <<"_HTML_";" にはさまれた文字列を指定しなければエラーになります。

ただし、現在 Web Liberty で配布しているプログラムは、外部HTMLファイルでデザイン変更ができるため、上の内容はほとんど意識する必要は無いと思います。

変数について

プログラムの中によく $title など $ から始まる言葉がありますが、これらが変数です。変数には『スカラー変数』、『配列変数』、『連想配列変数』など色々ありますが、ここではスカラー変数を例に挙げて説明します。

文字列の出力についてで説明したように

print "文字列を出力";

と記述すると画面に『文字列を出力』と表示されます。また、以下のプログラムでも実行結果は同じになります。

$scalar = "文字列";
print "$scalarを出力";

この例では $scalar が変数です。変数とは文字や数字を代入するためのものでこの場合、$scalar文字列 という文字が代入されます。そして print "$scalarを出力";$scalar には既に 文字列 が代入されているため、結果は 文字列を出力 になります。

なお、スカラー変数は最初に $ を付けるのが決まりです。$ の後に任意の名前を付けるのですが、名前に使用できるのは『英数字』、『_』、『.』です。ただし、最初の一文字は『英字』か『_』でつけなければなりません。文字数に制限はありませんが、大文字小文字は区別されるので注意しなければなりません。

文字化けについて

『ログを表示する』という言葉を表示させようとそのまま記述すると『ログを侮ヲする』と、文字化けして表示されることがあります。

これは、『表』の文字コードがシフトJISでは『95,5C』のため、5C (\) という特殊文字で直後の『示』の文字コード『8E,46』の 8E がエスケープされるためです。これにより、本来の文字コードは『95,5C,8E,46』なのに『95,8E,46』という文字コードに解釈され、『表示』ではなく『侮ヲ』となってしまいます。

その解決方法が文字の直後に『\』を挿入するというものです。

『表\示』と記述することで文字コードは『95,5C,5C,8E,46』となり、『5C,5C』の部分、つまり『\\』は単独の『\』と解釈され、結果的に『5C』となります。つまり、『95,5C,8E,46』と解釈されるため、『表示』と文字化けすることなく表示する事ができます。 なお、この処理が必要になるのは『5C』を含むシフトJISの文字すべてです。

以下に『5C』を含むシフトJISの文字を挙げていますので、これらの文字を設定する場合、同様に対処してください。

―(81,5C) ソ(83,5C) Ы(84,5C) Ⅸ(87,5C) 噂(89,5C) 浬(8A,5C) 欺(8B,5C) 圭(8C,5C)
構(8D,5C) 蚕(8E,5C) 十(8F,5C) 申(90,5C) 曾(91,5C) 箪(92,5C) 貼(93,5C) 能(94,5C)
表(95,5C) 暴(96,5C) 予(97,5C) 禄(98,5C) 兔(99,5C) 喀(9A,5C) 媾(9B,5C) 彌(9C,5C)
拿(9D,5C) 杤(9E,5C) 歃(9F,5C) 濬(E0,5C) 畚(E1,5C) 秉(E2,5C) 綵(E3,5C) 臀(E4,5C)
藹(E5,5C) 觸(E6,5C) 軆(E7,5C) 鐔(E8,5C) 饅(E9,5C) 鷭(EA,5C) 偆(ED,5C) 砡(EE,5C)

と、難しそうな事を書いていますが、もし文字化けしてしまったら文字化けした文字の前後に『\』を入れて色々と試してみてください。(^^;

ただし、現在 Web Liberty で配布しているプログラムは UTF-8 という文字コードで記述しているため、上の内容はほとんど意識する必要は無いと思います。

@(アットマーク)の注意点

Perlでは、@(アットマーク)を表示しようとするとエラーになる事があります。(場合によっては大丈夫なんですが。)メールアドレスを表示しようとして、プログラム中に sample@sample.co.jp と記述するとエラーになる可能性があります。

この場合、sample\@sample.co.jp と、@ の前に \ を付けるとエラーを回避する事ができます。

ただし、現在 Web Liberty で配布しているプログラムは、外部HTMLファイルでデザイン変更ができるため、上の内容はほとんど意識する必要は無いと思います。

例えば、プログラムの中にある『掲示板に戻る』という文字列を『Back』に変更したいとします。ですが、数百行~数千行のファイルの中から該当文字列を探すのはかなり大変な作業です。

ここでは、TeraPad の検索機能を利用した文字列の検索方法を紹介します。(検索・置換機能はほとんどのエディタに実装されていると思います。Windows付属のメモ帳にもあります。)

まず、改造したいファイルをTeraPadで開き、メニューバーから『検索(S) → 検索(F)...』を実行します。(ツールバーの右から3番目のアイコンをクリックしても同じ結果になります。)

スクリーンショット

そうすると以下のようなダイアログが表示されます。『検索する文字列(T)』に検索したい文字列を入力し、『先頭から検索(O)』を実行します。

スクリーンショット

ファイルが先頭から順に検索され、該当する文字列があれば以下のように選択状態になります。さらにメニューバーから『検索(S) → 下を検索(D)』を実行すると、次の文字列を検索します。(ツールバーの一番右のアイコンをクリックしても同じ結果になります。)

スクリーンショット

また、メニューバーから『検索(S) → 置換(R)...』を実行すると、該当する文字列すべてを書き換えることもできます。(関係ない箇所まで置換してしまう可能性があるので、注意が必要です。)色々試して自分にあった方法を探してください。