Perl 超・基礎講座

書き換えミスを失くすために

前へ 次へ トップに戻る

「Perlとはなんたらかんたらの略で、UNIX上で開発された〜〜」・・・
なあんてマニュアル的なことはどうでもいい。(ていうか、知らない(笑))
ここまでのページで、PerlのインストールCopalのインストールが済んでいれば、Perlなんて簡単なもんです。

  1. 書き方
  2. 変数の使い方
  3. 変数の使い方の失敗例
  4. 注意する文字列
  5. コメント文
  6. CGIファイルにする
  7. HTMLで表示させる

書き方

スクリプト 結果
print "こんにちは" こんにちは

たったこんだけ。これでも立派なPerlスクリプトってもんです。

いちおう、「print」ってのが「画面に出力する」って命令で、文字列は命令と間違えないように「""」で括るってのがお約束らしいっス。
んじゃ調子に乗って・・・

スクリプト 結果
print "こんにちは"
print "さようなら"
syntax error at C:\temp\copal.pl line 2, near "print"
Execution of hello aborted due to compilation errors.

あらあら、早速なんかエラー出ちゃってますよー。
いきなり「文法エラー」とか言われてます(T_T)
そう、PerlはC言語とかと同じく、改行をコマンドの区切りとは理解しないので、命令文の区切りには「;」(セミコロン)を入れてやらなきゃならないのだ

スクリプト 結果
print "こんにちは";
print "さようなら";
こんにちはさようなら

おっけーおっけー、文末の「;」は習慣にしなきゃね。
でもちょっと格好悪いな。改行ぐらい入れたいじゃないの。
それには「\n」というおまじない文字を・・・

スクリプト 結果
print "こんにちは\n";
print "さようなら";
こんにちは
さようなら

ばっちりっス(^_^)v

変数の使い方

スクリプト 結果
$hello = "こんにちは";
print $hello;
こんにちは

Perlでは、「$」で始まる文字列は変数として扱われます。
「=」で、「$hello」という名の変数に「こんにちは」という文字列を代入しています。
変数を使うことで、同じ文字列を何度も使う場合にも設定が1箇所で済んだり、ユーザによって書き換える可能性のある部分をスクリプト内の判り易い箇所にまとめて配置したりすることができます。

そう、我々が既成のCGIを導入する際に書き換えている部分のほとんどが、実はこの、変数に代入する文字列部分だったのでした。

変数の使い方の失敗例

スクリプト 結果
$hello = "";
print $hello;
 

これはOKです。
結果には何も出ませんが、変数「$hello」の中に何も入れない。または「$hello」の中を空にするという意味で、Perlの文法としては合っています。

スクリプト 結果
$hello = ;
print $hello;
syntax error at C:\temp\copal.pl line 1, near "= ;"
Execution of C:\temp\copal.pl aborted due to compilation errors.

これはアウトです。
右辺から左辺に値を代入するという「=」命令の右辺が存在しないので、1行目の命令文自体が完結してないというエラーです。

スクリプト 結果
$hello = "<BODY BGCOLOR="#FFFFE0">";
print $hello;
syntax error at C:\temp\copal.pl line 2, near "print"
Execution of C:\temp\copal.pl aborted due to compilation errors.

HTMLのタグを定義する時によくやるエラーです。
タグ中に出てくる「"」を、文字列の終わりの記号と解釈してしまうため、その後ろがPerlの文としてはデタラメになっちゃうわけです。
この回避法には2通りあり、

スクリプト 結果
$hello = '<BODY BGCOLOR="#FFFFE0">';
print $hello;
<BODY BGCOLOR="#FFFFE0">

と、文字列を「"」(ダブルクォーテーション)でなく「'」(シングルクォーテーション)で括る方法と、

スクリプト 結果
$hello = "<BODY BGCOLOR=\"#FFFFE0\">";
print $hello;
<BODY BGCOLOR="#FFFFE0">

このように、文字列の括りとして解釈して欲しくない「"」の前に「\」を置くことで、「"」Perlの文法的な特殊文字からエスケープして「"」という文字そのものなのだよ〜と解釈させることができます。

注意する文字列

スクリプト 結果
$hello = "はじめてのCGI@nifty";
print $hello;
Literal @nifty now requires backslash at C:\temp\copal.pl line 1, within string
Execution of C:\temp\copal.pl aborted due to compilation errors.

Perlでは、「$」「"」などなど、記号のほとんどが特殊な意味を持っているので、文字列として使いたい場合には注意が必要です。このケースでは「@」が引っ掛かっています。
この対処法も、前述と同じく、

スクリプト 結果
$hello = "はじめてのCGI\@nifty";
print $hello;
はじめてのCGI@nifty

と、「\」を入れて「@」を「記号じゃなくて文字そのものなのだよ〜」と、エスケープします。
(実はこの「@」は配列変数の印なので、変数を展開しない「'」作戦も通用したりする)

または、こんなパターンもあります。

スクリプト 結果
$hello = "表示する";
print $hello;
侮ヲする

Perlとしてはエラーではありませんが、文字化けするケースです。
これはスクリプトをShift-JISで扱う限り避けられないパターンで、理由はKENTさんのこのページが非常に判り易いのですが、対処法としては、やはり

スクリプト 結果
$hello = "表\示する";
print $hello;
表示する

と、「\」でエスケープするわけですが、この場合、引っ掛かる文字「表」の後ろに付けるのがポイントです。

コメント文

スクリプト 結果
# 表示したい文字列を記入
$hello = "こんにちは";    # 変数$helloに文字列を代入
print $hello;            # ここで表示している
こんにちは

「#」で始まる文字列は、行末(改行)までコメントとして、Perlの実行時には無視されますので、このように注釈を付けることができます。

CGIファイルにする

Perlスクリプトは、そのままCGIスクリプトにすることができます。

スクリプト Perlでの結果 ブラウザでの結果
#!/usr/local/bin/perl

print "Content-type: text/html\n\n";
print "こんにちは";
Content-type: text/html

こんにちは
こんにちは

この2行のおまじないを付け加えるだけです。
このファイルを"hello.cgi"とかで保存してサーバーに転送すれば、立派なCGIスクリプトのの出来上がりってわけです。

#!/usr/local/bin/perl
お馴染み、プロバイダから案内されたPerlのパスを記入する部分です。必ず1行目の行頭に置く必要があります。

print "Content-type: text/html\n\n";
CGIが実行されてブラウザに返って来る時に、それがテキストか画像かなどをブラウザに知らせる部分です。この行がブラウザに表示されることはありませんが、これを忘れるとサーバーエラーになります。

HTMLで表示させる

スクリプト Perlでの結果 ブラウザでの結果
#!/usr/local/bin/perl

print "Content-type: text/html\n\n";
print "<html><head>\n";
print "</head><body>\n";
print "こんにちは\n";
print "</body></html>";
Content-type: text/html

<html><head>
</head><body>
こんにちは
</body></html>
こんにちは

ここまで出来れば、もう可能性は無限大です。

要は、これをもっと複雑にしたものが掲示板だったりカウンタだったりするわけです。
あとはファイルの入出力の方法や、時間やブラウザ情報など環境変数の取得法、「もしも〜だったら〜する」といった制御構文正規表現などを勉強すれば、自由自在に、インタラクティブなページが構築できるのです。
(って・・・それが大変なんだっつーの(笑))

では次回は「正規表現ってなんだ?」の巻・・・(うそ)


【ひとりごと】ふと、うっかり、パソコン書籍売り場で「CGI入門」なんて本を買っちゃうと、Perlの基礎もなしに、いきなり「掲示板を作ろう」なんて、ものすごい複雑なスクリプトから始まっちゃうヤツがあるんですが、入門しようって人に役立つとはとても思えないんスけど・・・


前へ 次へ トップに戻る

Gポイントポイ活 Amazon Yahoo 楽天

無料ホームページ 楽天モバイル[UNLIMITが今なら1円] 海外格安航空券 海外旅行保険が無料!