Hatena::ブログ(Diary)

WEB開発初心者の成長記録 このページをアンテナに追加 RSSフィード

2009-05-20

【perl】プロトタイププログラム「入力フォーム→入力データ表示」のプログラムを書いた。

こちら↓で紹介した初プログラムを完成させる前に、プロトタイプとして以下のプログラムを作成していました。せっかくなので、そちらも公開。

http://d.hatena.ne.jp/midori_kasugano/20090520/1242953284


プロトタイプは、入力フォームがメッセージ入力のみの1つ。

プログラム(上記リンク先)は、入力フォームがメッセージと名前入力の2つ。


【1.入力フォーム】form2.html

<html>
<head>
<title>入力フォーム</title>
</head>
<body>
<form method="post" action="form2.cgi">
<p>メッセージを入力してください</p>
<input type="text" name="message" size="20">
<input type="submit" value="送信">
</form>
</body>
</html>

【2.入力された値を返してブラウザ表示する】form2.cgi

#! /usr/bin/perl

#1.入力されたデータを受け取る
read(STDIN, $alldata, $ENV{'CONTENT_LENGTH'});

#1-1.read関数で受け取った入力データを変換(入力データはエンコーディングされて送られてくるため)
#エンコーディングデータをsplit関数にて=で分割し、=の左側あるデータを$keyに、右側にあるデータを$valueに入れる。
($key, $value) = split(/=/,$alldata);
#=の右側にあったデータの変換作業
#正規表現の利用
$value = ~ s/\+/ /g;
$value = ~ s/%([a-fA-F0-9][a-fA-F0-9])/pack('H2',$1)/eg;

#連想配列を使用
$put{"$key"} = $value;

#2.入力してもらった情報をブラウザ表示する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>入力されたメッセージは$put{'message'}です。</p>\n";

print "</body>\n";
print "</html>\n";

このプログラムも、実は、ヒアドキュメントやモジュールを使ったほうがかなり楽。


perl初心者の私がどうやって調べたかですが、以下の記事の文末に紹介してあります。

http://d.hatena.ne.jp/midori_kasugano/20090520/1242953284


ソース作成時にもっとも使用した書籍は、ハーシー著の「Perl/CGI」です。

これに、HTTPクライアントPC間でどんな風にデータのやり取りがなされるか(エンコーディングについて)も書いてあるし、ポイントとなるsplit関数環境変数正規表現なんかも書いてあります。

これらの情報を元に試行錯誤をすると、なんだかできあがっちゃった感じです。


※ただし、いまだpack関数は意味が分かりません。関数リファレンスで、公式は発見したものの、意味がわからない…。H2という数字は、人力でいろいろ試してみた結果です。

【perl】「入力フォーム→入力データ表示」のプログラムを書いた。

perlってどんな言語?、という状態から2日と半分。頭を悩ませまくり、調べまくってようやく書いた初perlプログラムです。


ちなみに、プロトタイプはこちら↓(これより簡単なものを先に作りました。)

http://d.hatena.ne.jp/midori_kasugano/20090520/1242976726


動作確認できてます。動作環境は以下。

xampp

・Active Perl

windows XP

firefoxIE(すみません、バージョン忘れました。)



私にとっては記念すべき初プログラムなので、ソースを載せちゃいます。


【1.入力フォーム】forms.html

<html>
<head>
<title>入力フォーム</title>
</head>
<body>
<form method="post" action="forms.cgi">
 <p>メッセージを入力してください</p>
 <input type="text" name="message" size=20>
 <p>お名前を入力してください</p>
 <input type="text" name="name" saze=10>
 <input type="submit" value="送信">
</form>
</body>
</html>


【2.入力されたデータを表示させる】forms.cgi

#! usr/bin/perl

#送信されたデータを受け取る
read(STDIN, $alldata, $ENV{'CONTENT_LENGTH'});

foreach $data (split(/&/,$alldata)){
 ($key, $value) = split(/=/,$data);
 $value = ~s/\+/ /g;
 $value = ~s/%([a-fA-F0-9][a-fA-F0-9])/pack('H2, $1')/eg;

 $put{"$key"} = $value;
}

#ブラウザ表示のためのHTML
print "Content-Type: test/html; charset=Shift_JIS\n\n";
print "<html>\n";
print "<head><title>表示画面</title></head>\n";
print "<body>\n";

#受け取ったデータをブラウザに表示させる
print "<p>入力されたメッセージは$put{'message'}です。</p>\n";
print "<p>入力されたお名前は$put{'name'}です。</p>\n";

print "</body>\n";
print "</html>\n";

1は問題なくプログラミングできたんです。難産だったのは2。2については、モジュールを使ったりヒアドキュメントを使ったらもっと簡単なんです。

ヒアドキュメントの使用については、全くそこに頭がいきませんでした。モジュールの使用については、どうやってプログラムが動くのかさっぱり理解できなかったので、使用をあきらめました。


百戦錬磨のプログラマーから見ると、ヒアドキュメントやモジュールを使ってない点から、なんとめんどくさいことを、みたいな感じらしいです。(ただ、勉強には良いようです。)


ま、ヒアドキュメントやらモジュールやら2の詳しい説明やらは、また後日。


ちなみに、このプログラム作成で参考にしたものは以下。


(1)perlを知る

このプログラムを書く前に、この本の最初の20ページを読んでperlとはどんな言語なのか概要を理解。特に、配列連想配列(HASH)についての理解を行った。最初の20ページ以外は、全く参照していません。


(2)実際にプログラミング

下の2冊と、ネットでの関数リファレンスと用語辞典の合わせ技で作成。

この処理を行うにはこーするのです、というのが具体的に書いてある。本質的な理解はこの本だけでは進まなかったが、いち具体例を参照する分には役に立ちました。使い方としては、この本の目次を見て、行いたい処理に近いページをつまみ読み。(わからない部分を芋づる式にたどった結果、結局すべてに目を通していました。)

この本で理解しきれないことは、下の本で検索。辞書的に使用しました。

本質的な理解をする手助けになった本。


以上3冊は発行年度が古いものなので、買うなら新しいものを。