CGIを軽く読むためのPerl
テスト環境の作り方
手順
Windows上でもCGIのテストを行う環境がタダでつくれちゃいます。
- 自分のマシンをサーバー化する
- AN HTTPD等をインストール
- AN HTTPDはこちらのサイトからダウンロードできます
- Perlをインストールし、サーバーから走らせられるようにする
- Active StateからActive Perlを入手
- AN HTTPDの場合、拡張子「.pl」「.cgi」の実行プログラムをperl.exeに設定する
詳しいことはKENT WEB「自宅マシンWWWサーバ化計画」がいい感じです。
Perlの文法最小限
ここでは、簡単なプログラムを読むための最小限の知識を書いています。
(クリックするとアコーディオンを開きます)
1.処理本体ではないもの
処理本体ではないもの
- 1行目の#!
- #!/usr/local/bin/perlこれは、サーバー側のperlのパスです。Linuxの形式で書かれているのでWindowsユーザーは面食らうかもしれません。たまに #!/usr/bin/perl のサーバーもありますのでお気をつけください。
- #(コメント)
- 行中の#以降はコメントとしてプログラムの文としては無視されます。
- つまり、#をつければ好きなだけ備忘録が書けるってことです。
- Web上で配布されているCGIは、使用者が関わる部分に非常に親切なコメントをつけているものが多いです。
2.変数($xxx、@yyy、%zzzなど)
変数
変数とは、簡単に言えば「マ○オの残機をメモしておくところ」みたいなものです。
アクセスカウンターではアクセス数、掲示板ではコメントなどが「変数」によって「メモ」されています。
Perlの変数は「数値」「文字列」などの区別がなく、C言語他難解なプログラム言語に比べ圧倒的に簡単です。
2-1.基本形式
- $xxx スカラー変数
- データを入れるものとして、最も単純な変数です。
- $abc = 123;となっていれば、
- $abcという変数には123という値が入っているということです。
- 他に、
- $abc = $def;というように、他の変数の値を入れることもできます。
- 例えば、
- $def = 10;
- $abc = $def
- という場合、$abcには10という値が入ります。
- また、変数は文字列も扱えます。
- $abc = "Hello, perl.";とした場合、$abcという変数にはHello, Perl.という文字列(文章じゃないですよ)が入っているということです。
- 変数に文字列を入れる場合として、外部プログラム等のパスを指定する場合や、掲示板のタイトルなどを設定したりする場合があります。
- ex. $title = "私の掲示板";
- ちなみに、$aと$Aは別の変数として扱われます。
- ex. $a = 1;$A=2; とした時、print "$a $A"; の実行結果は「1 2」となります。(printは画面等に出力する"関数"です。関数についての詳細は後に述べます)
- @xxx,$xxx[1] 配列
- 野球のスコアみたいに、同じグループとしてみなせる変数を入れることができます。
- 例えば、1回から9回までのチームAのスコアをscoreAという配列に入れる場合、
- @scoreA = (0,2,1,0,0,1,1,0,0);
- というようになります。
- ここで、例えば3回のスコアを0にしたい時はどうなるのでしょうか?
- 答えは、$scoreA[2] = 0;です。
- 一般に、配列のX番目の値は$scoreA[X-1]に入っています。
- 1番目の値は$scoreA[0]、2番目の値は$scoreA[1]という具合です。
- Fortran等では1番目の変数はscore(1)というように表しますが、Perlでは配列の"0番目"が人間様にとっての1番目の要素となります。
- %,${''} 連想配列
- %watashiという連想配列により、個人の情報を管理するとします。
- 各要素を
- $watashi{"name"} = "Suzuki Taro";
- $watashi{"age"} = 20;
- というように指定することで、
- 「X番目」ではなく「Xという名前」の要素を持つ配列を定義することができます。これが連想配列です。
- 掲示板の書き込み処理の時などにその威力を発揮します。
- 掲示板のフォームから「name=なんとかさん,e-mail=hoge@hogehoge.com,body=こんにちは」と書かれたとき、
- $write{"name"} = "なんとかさん";
- $write{"e-mail"} = "hoge@hogehoge.com";
- $write{"body"} = "こんにちは";
- として、書き込みデータを管理するのはよくあることです。
- ※変数名のタブー
- 数字で始まってはいけません。(× $4joukarasuma)
- ハイフンは使えません。(× $shin-osakaこれは「$shin」 - 「osaka」という引き算の演算と解釈され、エラーになります)ちなみにアンダーバー「_」はOKです。(○ $sanjo_keihan)
2-2.演算
- 四則計算
- 足し算 +
- 引き算 -
- 掛け算 *
- 割り算 /
- 剰余(mod) %
- 例:(三角形の面積)
- $Menseki = $Teihen * $Takasa /2;
- ゼロで割るようなことがなければ、変数も式中に入れられます。
- ゼロで割ったら「Internal Server Error」になりますよ!
- インクリメント($abc++;)
- $abc++;は$abc = $abc + 1;と同じです。
- 例えば、
- $abc = 2;
- $abc = $abc + 1;
- という場合、実行後には$abcの値は3になります。
- 論理演算($a && $b、$a || $b、!$a)
- 処理制御(if等)と組み合わされることが多いです。
- $a(が0でない)かつ$b(が0でない) => $a&&$b
- $a(が0でない)または$b(が0でない) => $a||$b
- 「&」や「|」は重ねないと論理演算として用をなしません。
- × $a & $b
- ○ $a && $b
- 比較($a > $b)
- $a は $bより大きい => $a > $b
- $a は $bより小さい => $a < $b
- $a は $b以上 => $a >= $b
- 論理演算の中で、$a > $b && $a > 0という使われ方をすることもあります。(これは、$a が$bより大きく、かつ$aが0より大きい ということです)
- 文字連結
- $BeforeX = "ABC";
- $BeforeY = "abc";
- $After = $BeforeX . $BeforeY;
- なんてことをすれば、$After = "ABCabc";と同義です。
2-3.クォーテーション(「'」や「"」)
- ""の中に$aとすると、$aの部分は$aの内容に置き換ります。
- ex. print "結果は $result です";>「結果は 成功 です」など
- ''の中に$aとすると、$aと出力されます。($aの内容は出力されない)
- ex. print '結果は $result です'; >「結果は $result です」
- ""の中に"があるとエラーになる。
- ex. ×print "He said "This is a pen." ";
- 対策 print "He said \"This is a pen.\" "; 「"」の前に「\」を入れて「\"」とする
2-4.エスケープシーケンス(\nなど)
本当はたくさんありますが、最もよく使うのは以下のとおりです。
- \n 改行
- \" ダブルクォーテーション文字「"」
- \' シングルクォーテーション文字「'」
- \\ 「\」文字自体の出力
ダブルクォーテーション文字などは、プログラム中でソースの一区切りとして使用されるので、例えばダブルクォーテーションを変数中で扱う時などはエスケープシーケンスを使うという工夫がいるわけです。
2-5.その他特殊な変数
- $_ ループで配列から取り出されたスカラ変数、関数の引数など(後にも述べます)
- @_ 関数の引数の配列
- $1 $2 ... 正規表現()
- $a = <<"EOM"
- 例:
- $a = <<"EOM"
- ここには複数行の文章を
- 入れられます
- EOM
- 配列に複数行の文字列を入れたいけど、\nを使うのがうっとうしい場合などに使います。
- ""内の文字列は適当に。
- ""内の文字列のところまでが変数の内容となります。
3.正規表現(パターンマッチ)
正規表現
- 検索
- /(検索文字列パターン)/(検索条件)
- 置換
- /(置換前の文字列)/(置換後の文字列)/
- 書き方
- 頻出文字
- ? 任意の1文字
- * 任意の文字列
- [] 文字列グループ[0-9][a-z][A-Z]
4.処理制御文の読み方
処理制御文の読み方
- if分岐文
- if(条件){
- (実行文)
- }
- という書き方で、
- 「if」まで処理したとき「条件」を満たすならば「実行文」の部分を実行するというものです。
- 例:
- whileループ文
- while(条件){
- (実行文)
- }
- と書きます。
- whileまで処理したとき「条件」をみたすならば、
- 「実行文」の部分を実行します。
- 「実行文」の部分の処理が完了した時点で再び「条件」を満たすかどうか判定します。
- 満たすなら、再度「実行文」の部分を実行します。
- 満たさないなら、「}」より後の処理に移行します。
- このループでは「条件」を満たす限り、何度でも「実行文」の部分が繰り返されます。
- foreachループ文
- foreach $abc (データ){
- (実行文)
- }
- と書きます。
- ループの各週で、「データ」から1つ要素を取り出し$abcに格納して、「実行文」の処理を行います。
- 「データ」から全ての要素を取り出し終えた時、ループから抜け出します。
- ループ内処理制御
- break文ループを抜け出します。
- next文条件文のところへ戻ります。
5.サブルーチン(sub xxx{...)
サブルーチン
- サブルーチン
- ひとかたまりのプログラムをモジュール化するとプログラムがすっきりします。これを実現するのがサブルーチンです。
- sub func{
- (処理本文)
- }
- 呼び出す時は、&func(引数);とします。
- 引数はサブルーチン内では@_に格納されます。
- 例:
- $result = &kakezan(2,3);
- sub kakezan{
- return $_[0] * $_[1];
- }
- returnは戻り値です。
6.関数
関数
- 画面やファイルに文字列を出力します。
- ファイル出力については後述します。
- print <<"EOM"
- (複数行の文字列)
- EOM
- とした場合、複数行の文字列が出力されます。
- ex. print "結果は $a です";
- ex. print &result;
- require (ファイル名)
- 「ファイル名」で指定した外部ファイルを読み込みます。
- 指定するファイル名は、変数にしてもかまいません。
- time
- 現在時刻を返します。(1970年1月1日0時0分からの秒数 要確認)
- crypt
- 文字列の暗号化を行います。
- sleep (数値)
- 指定した「数値」(ミリ秒)だけ、処理を停止し待機します。
- chmod(パーミッション,ファイル名)
- 「ファイル名」のパーミッションを「パーミッション」に変更します。
文字列操作
- length(文字列)
- 「文字列」の長さを返します。(単位:バイト)
- index
- split(/分割文字列/,データ)
- 「データ」の文字列を「分割文字列」により分割します。
- 関数自体は、「分割文字列」の前の文字列を返します。
- foreachループ文のデータとして使用した場合、ループ中で文字列の分割状態は保存されます。
- 例えば、$abc = "name=サンプル,e-mail=hoge@hogehoge.com,body=こんにちは";というデータを
- foreach(split(/","/,$abc)){...というループで使用した場合、
- 1週目で取り出されるのは「name=サンプル」
- 2週目で取り出されるのは「e-mail=hoge@hogehoge.com」となります。
- sprintf("",...);
- 文字列を整形します。
- ""内に書式を記述し、「...」にて(以下執筆待ち)
- chop
配列操作
- pop
- push
- shift
- unshift
- sort
- reverse
7.ファイル操作
ファイル操作
ファイル操作は関数を用いて行います。
ただし、ファイル操作に特有の一連の流れというものがあるので、関数とは独立して項目を作りました。
- 読み込み
- open(READ,"ファイル名");
- while(READ){
- $[] = <READ>;
- i++;
- }
- close(READ);
- ※実際には、ファイルが開けなかった時の処理も記述する。
- 書き込み
- ファイル生成
- ファイル削除
- unlink
- ファイル名変更
- rename
- ディレクトリ生成
- mkdir
- ディレクトリ削除
- rmdir

HOME