オレンジネットユーザーズ
CGI勉強会

第5回 実際にCGIスクリプトを作ってみる 基礎知識編(2)

Since 1996.7.11 / Last Update 1996.7.13

1.受け取ったデータ(メッセージ)をスクリプトで読む

ここでは,CGIを利用しない一般的なPerl(Practical Extraction and Report Language)プログラム で説明をします。
ある程度プログラミングの経験(Perl以外でも)が無いと,難しい説明かもしれません。

まず下記のようなフォームから

<FORM METHOD="POST" ACTION="/cgi-lib/get.pl">
項目A :<INPUT TYPE="text" MAXLENGTH=4 NAME="a">
項目B :<INPUT TYPE="text" MAXLENGTH=4 NAME="b">
項目C :<INPUT TYPE="text" MAXLENGTH=4 NAME="c">
<INPUT TYPE="submit" VALUE="Send"><INPUT TYPE="reset" VALUE="Reset">
</FORM>

訪問者が以下のように入力し Sendしたとします。

  項目A : 1
  項目B : 2
  項目C : 34
すると前回の説明のようにデータ a=1&b=2&c=34 がスクリプトに渡されます。
このデータをスクリプトの変数に代入する所までを今回説明します。
下記のプログラムは,このデータをキーボードから入力するものとなっています。

サンプルプログラム

¥記号は実際には\(バックスラッシュ)です。  #に続く文字列はコメントです。
#!/usr/bin/perl

#キーボード(標準入力)からデータを12文字入力して,変数datに代入する
#漢字は入力しないとします
read(STDIN,$dat,12);

#print文の次の行〜EOFと書かれた行までのデータを表示する
# ここは特に関係ない部分ですが,後で出てくるのでこんなのがあったな
# 程度に覚えておいて下さい
print <<EOF;
kibi
 goma
  biubiu.
EOF

print $dat,"\n"; #入力したデータの表示

#変数bufにsplit演算子でdatの内容を&で分離したものを代入する
# 変数bufの要素は ("a=1","b=2","c=34")となる
# 要素の参照は 0番目からとなります(C言語のargvのようなもの)
@buf = split('&',$dat);

print $buf[0],"\n"; #変数bufの要素の表示
print $buf[1],"\n";
print $buf[2],"\n";

#foreach文により変数bufの要素をひとつずつ取り出し変数itemに代入する
# そして { ... } の中の処理を全ての要素についておこなう(ここでは3つの要素)
foreach $item (@buf) {
  ($var,$value) = split('=',$item); #変数itemの内容を=で分離したものを
                                    #変数var,変数valueに代入する

  $itm{$var} = $value;              #変数itmの要素名varに要素値valueを代入する

print $var;
print $value,"\n"; #要素名と要素値をつなげて表示
}

$a = $itm{'a'}; #変数aに変数itmの要素名aの要素値を代入する
$b = $itm{'b'}; #変数bに変数itmの要素名bの要素値を代入する
$c = $itm{'c'}; #変数cに変数itmの要素名cの要素値を代入する
#変数itmはPealでいう連想配列というものでPerl文で内容を書くと
#%itm = ("a","1","b","2","c","34")となり"a"に対して"1"が
#"b"に対して"2"というようにキー(要素名)と値(要素値)が対になって記憶されます
#プログラミング言語の配列というと添字は数値なのが一般的ですが
#Perlでは文字も添字として使えるといったら解るでしょうか

print $a,"\n"; #変数aの表示
print $b,"\n"; #変数bの表示
print $c,"\n"; #変数cの表示

表示された結果

kibi
 goma
  biubiu.
a=1&b=2&c=34
a=1
b=2
c=34
a1
b2
c34
1
2
34
説明が難しかったかもしれませんが,自分で作ろうという人は是非理解して下さい。

キーワード

連想配列

[HOME][メニュー] [4][6]

kibita@orange.or.jp