Perlの基本的な文法

Perlの基本的な文法

サンプルCGIの解説

ここからは文法の解説になりますので、じっくりと読み進めていって下さい。
まずはPerlとCGIの基礎に掲載した sample.cgi のプログラムを例に、解説を進めていきます。

#!/usr/local/bin/perl
print "Content-Type: text/html; charset=Shift_JIS\n\n";
print "<html>";
print "<head><title>サンプル</title></head>";
print "<body>";
print "<p>初めてのCGI。</p>";
print "</body>";
print "</html>";
exit;

Perlのパス

CGIスクリプト1行目の #!/usr/local/bin/perlPerlのパスと呼ばれるもので、Perlを実行するためのプログラムが何処に存在するかを知らせるために記述します。この部分はサーバーに合わせて変更します。

print命令

2行目以降はすべて print "~"; という形式になっています。print はPerlに備わっている命令で、簡単に説明すると、画面に文字を表示させるための命令です。print に続けて "(ダブルクォート) で囲まれた文字列を書けば、その文字列が画面に表示されます。

なお、Perlでは命令の各行末に必ず ;(セミコロン) をつける決まりになっています。これを忘れるとプログラムが動作しないので、忘れずに記述してください。

はじめの print 命令は print "Content-Type: text/html; charset=Shift_JIS\n\n"; となっています。Content-Type: text/html の部分はCGIでHTML文章を表示するための決まり文句です。これはHTML文章を表示する前に必ず出力しなければなりません。
通常のHTMLファイルの場合、サーバーは拡張子から「これはHTML文章として表示すればいいのだな」と判断して表示してくれますが、CGIファイルの場合はそれができません。ですからその代わりに「これから表示する内容はHTML文章ですよ」と知らせるために記述します。
; charset=Shift_JIS の部分は「文字コードはShift-JISです。」と知らせるためのもので、文字化けの防止になります。
とりあえず「おまじない」だと思って、これらは必ず記述しておいてください。

それ以降の print 命令で、実際に画面に表示する内容を指定しています。表示する内容は以下のようになります。

<html>
<head><title>サンプル</title></head>
<body>
<p>初めてのCGI。</p>
</body>
</html>

このように、ブラウザに 初めてのCGI。 と表示するだけの内容になっています。print 命令の内容を変更して、表示される文字列を変更してみてください。
なお、print 命令は " ではなく ' で囲って表示する事もできます。具体的には、以下のようになります。

print '<p>初めてのCGI。</p>';

' で囲って表示した文字列内では、エスケープ文字や変数が展開されずにそのまま表示されます。エスケープ文字や変数については、後ほど紹介します。

文字化けについて

今回のプログラムは文字コードをShift-JISで作成していますが、Shift-JISでプログラムを作成すると特定の文字が文字化けする事があります。文字化けを回避するには、Shift-JIS以外の文字コードでプログラムを作成するか、特定の文字をエスケープ文字とともに出力する必要があります。

詳しくは文字化けについてを参照してください。

exit命令

最後の行に書かれている exit もPerlに備わっている命令で、プログラムを終了するための命令です。これがなくても、ファイルの最後までプログラムが実行されると自動的にプログラムは終了します。ですが「ここで終わりですよ」という事を明示的にしておいた方が、長く複雑なプログラムを書く場合にはどこが終わりなのか判りやすくなります。

改行について

ブラウザ上での改行

もし文字の改行を行いたい場合は、HTMLの文法に従って <br> タグを出力すればOKです。具体的には、以下のように記述します。

#!/usr/local/bin/perl
print "Content-Type: text/html; charset=Shift_JIS\n\n";
print "<html>";
print "<head><title>サンプル</title></head>";
print "<body>";
print "<p>初めてのCGI。<br>改行のテストです。</p>";
print "</body>";
print "</html>";
exit;

これで 初めてのCGI。 の直後で改行され、次の行に 改行のテストです。 が表示されるようになります。これは通常のHTML文章とまったく同じです。

HTMLソース上での改行

それでは、表示されたページのHTMLソースを表示させてみてください。HTML文章が表示されるはずですが、文章中でまったく改行がされていないと思います。

HTML文章を手書きで作成する場合、HTML文章を見やすくするために適度に改行を挿入しますが、上のプログラムだとそれがされていません。例えば

print "<body>";

という行を例に挙げると、これはあくまでも「<body> を出力する」という命令になっています。<body> の直後で改行をしたければ、別途改行文字を記述する必要があります。

Perlでは改行文字は \n と表現します。ですから print 命令で表示される文章中に \n と記述すると、その部分でHTMLソースが改行されます。

それでは、HTMLソースが改行されるように、sample.cgi の内容を書き換えてみます。一例を挙げると以下のようになります。

#!/usr/local/bin/perl
print "Content-Type: text/html; charset=Shift_JIS\n\n";
print "<html>\n";
print "<head><title>サンプル</title></head>\n";
print "<body>\n";
print "<p>初めてのCGI。</p>\n";
print "</body>\n";
print "</html>\n";
exit;

HTML表示部分の最後に、それぞれ \n を追加しています。これを実行して、そのHTMLソースを表示させてみてください。以下のように、改行されたHTMLが表示されます。

<html>
<head><title>サンプル</title></head>
<body>
<p>初めてのCGI。</p>
</body>
</html>

プログラム上での改行

プログラム中での改行や空行は、基本的には無視されます。また、半角スペースやタブも同様に無視されます。つまり、例えば

#!/usr/local/bin/perl

print "Content-Type: text/html; charset=Shift_JIS\n\n";

print "<html>\n";
print "<head><title>サンプル</title></head>\n";

  print "<body>\n";
  print "<p>初めてのCGI。</p>\n";
  print "</body>\n";

print "</html>\n";

exit;

このようにプログラムを記述しても、実行結果にはまったく影響はありません。自分で判りやすいと思うように、表示内容のまとまりごとに空行を入れたりするといいでしょう。(HTMLを書く際、読みやすく改行したりインデントしたりするのと同じです。)ただし、

pri
nt "<p>初めてのCGI。</p>\n";

このように命令の途中で改行すると、文法エラーになるので注意してください。

コメントについて

プログラムの行頭に # (シャープ)を付けると、その行は無視されます。例えば

#!/usr/local/bin/perl

print "Content-Type: text/html; charset=Shift_JIS\n\n";
print "<html>\n";
print "<head><title>サンプル</title></head>\n";
print "<body>\n";
print "<p>初めてのCGI。</p>\n";
#print "<p>コメントについて解説します。</p>\n";
print "</body>\n";
print "</html>\n";

exit;

このプログラムの場合、#print "<p>コメントについて解説します。</p>\n"; の行は無視して実行されます。ですから、ブラウザには 初めてのCGI。 のみが表示されます。

このように、行頭に # がある行は実行されなくなるので、プログラムを一時的に実行させたくない場合や、プログラムの説明を記載するときに使用されます。(HTMLのコメント機能と同じ用途です。)例えば、以下のように解説を記載することができます。

#!/usr/local/bin/perl

#HTMLを表示するための決まり文句
print "Content-Type: text/html; charset=Shift_JIS\n\n";

#ここから表示内容
print "<html>\n";
print "<head><title>サンプル</title></head>\n";
print "<body>\n";
print "<p>初めてのCGI。</p>\n";
print "</body>\n";
print "</html>\n";

#プログラムの終了
exit;

ただし、1行目の #! で始まる行はコメントではありません。CGIプログラムの1行目は特別な行なので、特別な意味を持っています。

エスケープ文字について

現在、print 命令で表示する内容は " で囲われています。それでは " を含むHTML文章を表示しようとするとどうなるでしょうか。例えば以下のようなプログラムです。

#!/usr/local/bin/perl

print "Content-Type: text/html; charset=Shift_JIS\n\n";

print "<html>\n";
print "<head><title>サンプル</title></head>\n";
print "<body>\n";
print "<p>初めてのCGI。</p>\n";
print "<p><font color="#FF0000">エスケープ文字</font>について解説します。</p>\n";
print "</body>\n";
print "</html>\n";

exit;

このプログラムを実行すると、エラーになります。print "~"; の場合、"" にはさまれた文字列を表示せよ。という意味になるので「print "<p><font color=" は理解できるけど、後に続く文字は何だ?」と解釈されてしまいます。

この場合、以下のように修正すると正しく表示されます。

#!/usr/local/bin/perl

print "Content-Type: text/html; charset=Shift_JIS\n\n";

print "<html>\n";
print "<head><title>サンプル</title></head>\n";
print "<body>\n";
print "<p>初めてのCGI。</p>\n";
print "<p><font color=\"#FF0000\">エスケープ文字</font>について解説します。</p>\n";
print "</body>\n";
print "</html>\n";

exit;

" の前にそれぞれ \ をつけています。\ はエスケープ文字と呼ばれるもので、これを記述すると、その直後の特別な文字を通常の文字として扱うことができます。上の例では "print で表示する範囲を示すための特別な文字でしたが、\" と記述することにより、通常の " として扱うことができます。

またこれとは逆に、特定の通常の文字の直前に記述すると直後の文字を特別な意味を持つ文字として扱うことができます。特別な文字とは、例えば n です。普通に n と記述すれば画面に n が表示されますが、\n と記述することにより、改行文字として扱うことができます。

CGIプログラムでよく使用される特殊文字は以下の通りです。

特殊文字 意味
\n 改行文字になります
\t タブになります