情報アプリケーション1 2006年 10月 19日 第四回資料 担当 重定 如彦 目次 • • • • • • 配列変数の中身の表示 フォームのデータの中身の解析 連想配列変数 日本語の処理 掲示板の仕組み 簡易掲示板 配列変数の中身の表示(1) Perlでは foreach という構文を使って配列変数の中に保存 されているデータを一つずつ取り出して処理することができる foreach 変数名 (配列変数名) { プログラム } 解説: 配列変数の中に格納された一つ一つのデータに対して 順番に{ と } の中に記述されたプログラムが実行される 取り出した配列変数の中身は 変数名 で指定した変数に格納される 配列変数の中身の表示(2) @pdata = split(/&/, “textbox=abc&cbox1=on&rbox=2”); foreach $parts (@pdata) { print “$parts<BR>\n”; } 上記のプログラムを実行すると、①で配列変数 @pdataに格納された 3つの文字列それぞれに対して順番に ② のプログラムが実行される その結果以下の3行が出力される textbox=abc<BR> cbox1=on<BR> rbox=2<BR> ① ② 配列変数の中身の表示(3) G:\www の form.cgiを開き、以下の赤い部分を追加して保存せよ。 #!/usr/local/bin/perl print "Content-Type: text/html; charset=sjis\n\n"; $clength = $ENV{'CONTENT_LENGTH'}; read(STDIN, $qstring, $clength); print "送られたデータは、「$qstring」です<BR>\n"; @pdata = split(/&/, $qstring); foreach $parts (@pdata) { print "$parts<BR>\n"; } フォームのデータの中身の解析(1) splitを使って分割されたデータは、 textbox=abc のように、 パーツの名前=パーツのデータ という形になっており、このままではパーツのデータを 直接扱うことはできない。そこで、それぞれのデータを パーツの名前とパーツのデータに分割する必要がある。 データは = 記号によって区切られているので split(/=/, “textbox=abc”); と記述すれば分割できる フォームのデータの中身の解析(2) splitを使って分割されたデータを、以下のように記述することで、 配列変数ではなく、通常の変数に代入することもできる。 (変数名1,変数名2,・・・) = split(・・・略・・・); 上記のように記述することで、splitで分割された文字列が()の 中に記述された変数に前から順番に代入される。 例: ($name, $data) = split(/=/, “textbox=abc”); 上記のプログラムを実行すると $nameという変数に textbox という文字列が、 $dataという変数に abc という文字列が代入される。 データの中身の分割(3) G:\www の form.cgiを開き、以下の赤い部分を変更して保存せよ。 #!/usr/local/bin/perl print "Content-Type: text/html; charset=sjis\n\n"; $clength = $ENV{'CONTENT_LENGTH'}; read(STDIN, $qstring, $clength); print "送られたデータは、「$qstring」です<BR>\n"; @pdata = split(/&/, $qstring); foreach $parts (@pdata) { ($name, $data) = split(/=/, $parts); print "パーツ名が $name のデータは $data です。<BR>\n"; } 連想配列変数(1) Perlでは連想配列変数という変数を使うことができる。 連想配列変数の性質は以下の通り • 変数名の前に $ ではなく % 記号を付ける • 配列変数と同様に複数のデータを格納することができる • 連想配列変数を理解するには引き出しに名前がついた箪笥 を想像すると良い。右下の図は、3つの 引き出しがある箪笥をあらわしているが、 それぞれの引き出しに名前がついている 上着 また、箪笥そのものにも「夏物入れ」という 名前がついている。このようにすることに 下着 よって、『「夏物入れ」の「上着」の段』のように 箪笥の引き出しを指定することができる ズボン 夏物入れ 連想配列変数(2) 連想配列変数では、先ほどの箪笥の例と同じように、データを格納する 名前のついた引き出しのようなものが用意されており、引き出しの中身を 以下のように記述することで指定することができる。 $連想配列変数名{‘インデックス名’} 連想配列変数では、箪笥の引き出しの名前に相当するものをインデックスと呼ぶ 記述例: $query{‘textbox’} = “abc”; $query{‘cbox1’} = “on”; $query{‘rbox’} = “2”; 補足: 連想配列変数そのものは %query のように %記号を使うが、連想配列変数の 各要素を記述する際は $query{‘rbox’} のように$記号を使う 連想配列変数の使用例 先ほどの記述例のように、連想配列変数を使ってパーツのデータを以下の ような方針で保存することで、パーツが複数存在するフォームのデータを CGIプログラムで容易に処理することができるようになる $query{‘パーツの名前’} = パーツのデータ; 例えば、 textbox という名前のテキストボックスの中身を知りたければ $query{‘textbox’} と記述すれば良い。 補足: さらにわかりやすくするには、HTML側に記述するそれぞれのパーツの 名前に、パーツの内容がすぐわかるような名前をつけると良い 連想配列変数への代入 G:\www の form.cgiを開き、以下の赤い部分を変更して保存せよ。 #!/usr/local/bin/perl print "Content-Type: text/html; charset=sjis\n\n"; $clength = $ENV{'CONTENT_LENGTH'}; read(STDIN, $qstring, $clength); print "送られたデータは、「$qstring」です<BR>\n"; @pdata = split(/&/, $qstring); foreach (@pdata) { ($name, $data) = split(/=/, $_); $query{$name} = $data; } print "テキストボックスの中身は $query{'textbox'} です。<BR>\n"; 日本語の処理(1) テキストボックスに日本語を入力してデータを送った場合、 入力したデータは(ある法則で)半角の文字に変換されて 送られる。試しにform.htmlのテキストボックスに日本語を 入力してどのようなデータが送られるかを確かめること。 半角の文字に変換される理由は、HTTPで送るデータには 全角文字を使うことが出来ないなどの決まりがあるため そこで、テキストボックスに日本語が入力されてデータが 送られてきた場合は、半角に変換された文字を再び全角の 日本語に戻す必要がある。なお、テキストボックスに限らず、 チェックボックスなどのvalue属性に日本語を記述した場合も 同様の変換が行われる点に注意が必要である。 日本語の処理(2) 半角に変換された文字を再び全角の日本語に戻すには、 テキストボックスのデータに対して以下の2行のプログラムを 実行すれば良い。なお、このプログラムについては、本授業の 範囲を大きく超えてしまうので、解説はしない。当面はこのよう に記述すれば変換されるということを覚えればよいだろう $data =~ tr/+/ /; $data =~ s/%([0-9a-fA-F][0-9a-fA-F])/pack("C",hex($1))/eg; この部分には変換したい文字列が入った変数を記述する 日本語の処理(3) G:\www の form.cgiを開き、以下の赤い部分を変更して保存せよ。 #!/usr/local/bin/perl print "Content-Type: text/html; charset=sjis\n\n"; $clength = $ENV{'CONTENT_LENGTH'}; read(STDIN, $qstring, $clength); print "送られたデータは、「$qstring」です<BR>\n"; @pdata = split(/&/, $qstring); foreach (@pdata) { ($name, $data) = split(/=/, $_); $data =~ tr/+/ /; $data =~ s/%([0-9a-fA-F][0-9a-fA-F])/pack("C",hex($1))/eg; $query{$name} = $data; } print "テキストボックスの中身は $query{'textbox'} です。<BR>\n"; 掲示板の仕組み(1) 簡単な掲示板のCGIを紹介する 掲示板の仕組みは以下の通り • ウェブサーバ内に掲示板に書き込まれた内容を記録する ファイルを用意する • 掲示板のフォームを使って掲示板の書込みが行われると 掲示板のcgiは書き込まれた内容をファイルに追加する。 • 記録されたファイルの中身の一覧を表示する 複雑な機能を持たない、単純な掲示板のCGIであれば、 基本的な仕組みはアクセスカウンタとあまり変わらない 掲示板の仕組み(2) 1.CGIにアクセス フォームに書き込まれたデータは 重定:こんにちは、誰かいませんか? CGIプログラム 3.掲示板に書かれた 内容を表示するHTML を作成して返信する ウェブサーバ keijiban.cgi 2.ファイルを開き フォームの中身を 追加する 管理人:自由に書込みして下さい。 重定:こんにちは、誰かいませんか? kakikomi.txt 簡易掲示板(1) • フォームが記述されたHTML文章の作成 まず、メモ帳に以下のHTMLをデスクトップに keijiban.html という名前で ファイルに保存し、ffftpを使ってウェブサーバにアップロードすること。 <HTML> <HEAD> <TITLE>掲示板</TITLE> </HEAD> <BODY> <FORM method="POST" action=“keijiban.cgi"> 名前<INPUT TYPE=“text” name=“name”> <INPUT TYPE=“text” name=“kakikomi” size=“50”> <INPUT TYPE=“submit” value=“書き込む"> <INPUT TYPE="reset"> </FORM> </BODY> </HTML> 注:これはテキストボックスの 文字数を指定する属性 簡易掲示板(2) • 掲示板のCGIの作成 メモ帳を新しく開き、以下のCGIをデスクトップに keijiban.cgi という名前で 保存し、ffftpを使ってウェブサーバにアップロードし、属性を変更すること。 #!/usr/local/bin/perl print "Content-Type: text/html; charset=sjis\n\n"; $clength = $ENV{'CONTENT_LENGTH'}; read(STDIN, $qstring, $clength); @pdata = split(/&/, $qstring); foreach (@pdata) { ($name, $data) = split(/=/, $_); $data =~ tr/+/ /; $data =~ s/%([0-9a-fA-F][0-9a-fA-F])/pack("C",hex($1))/eg; $query{$name} = $data; } 注:次のスライドに続く。なお、ここまでは、form.cgiの前半と全く同じ 簡易掲示板(3) 前のスライドの続き open OUT, ">>kakikomi.txt"; print OUT "$query{'name'}:$query{'kakikomi'}\n"; close OUT; ① open IN, "<kakikomi.txt"; while (<IN>) { print "$_<BR>\n"; } close IN; ② print <<HTML_DATA; <A HREF="keijiban.html">掲示板に戻る</A> HTML_DATA ③ 簡易掲示板(4) 最後に、kakikomi.txt という空のファイルをメモ帳で作成し、デスクトップに 保存する。保存したファイルをffftpでウェブサーバに転送し、転送したファイル の属性変更パネルを開き、すべての「更新」のチェックをONに設定する プログラムの説明 ①の部分 open OUT, ">>kakikomi.txt"; print OUT "$query{'name'}:$query{'kakikomi'}\n"; close OUT; 掲示板に書き込まれた内容が保存された、kakikomi.txt という名前の ファイルを追加書込みモード(>>記号)で開き、 print を使ってファイルの最後にフォームのテキストボックスに書き込まれた内容を 名前:書き込み内容 の形式で追加し、ファイルを閉じる 簡易掲示板(5) プログラムの説明 ②の部分 open IN, "<kakikomi.txt"; while (<IN>) { print "$_<BR>\n"; } close IN; 次に、kakikomi.txtを新しく読み込みモードで開く。 while の部分はforeachに似ており、これはファイルの中身を最初の 行から順番に一行ずつ読み込み、それぞれの行に対して print "$_<BR>\n"; が実行される($_は読み込まれた各行の内容)。これにより、 kakikomi.txtの中身が1行ずつ最後に<BR>を追加して出力される 簡易掲示板(6) プログラムの説明 ③の部分 print <<HTML_DATA; <A HREF="keijiban.html">掲示板に戻る</A> HTML_DATA 最後に、掲示板のフォームに戻るためのリンクを出力する この例題では<HTML>などのタグは省略されているが、 余裕がそのようなタグも出力するように、このcgiを変更すること
© Copyright 2024 ExpyDoc