[2003年度] (6) (7)

Perl 入門 (7)

前回の課題のコメント


課題1の解答例1:

 1: open (DATA, "data.txt") || die "cannot open data.txt .. $!\n"; 
 2: while (<DATA>) {
 3:     if (/--/) { print } #### { print; } がベター
 4: }
 5: close DATA;


3行目のブロックの中でprintの後ろの「;」が省略されています。 確かにブロックの中に複数の文が並ぶとき一番最後の「;」は省略可能な場合が あるのですが、癖としていつも「;」をつけるようにしたほうがよいでしょう。
なお、HTMLファイルの中で上のような表示をする際、 「<」「>」 をそのまま書いてしまうとその部分がタグと解釈されてしまいます。 「&lt;」 「&gt;」を使うようにして下さい。


課題1の解答例2:

 1: open (DATA, "data.txt") || die "cannot open data.txt .. $!\n"; 
 2: while (<DATA>) {
 3:     if (/--/) { print , "\n"; } #### 「, "\n"」が余分
 4: }
 5: close DATA;


非常にたくさんあった解答です。printの後に、コンマがあってその後に改行文字だけからなる 文字列が続いています。コンマの前になにも書いてないのは($_, "\n") というリストのつもりでしょうか。 もし、print ($_, "\n"); とやれば、$_の末尾の改行文字とリストで付け加えた改行文字が 二重になって、一行置きに出力されます。実際に上のスクリプトを実行すると、文字列"\n" は無視されてしまいます。無視されるのを確かめたかったら、"\n"のかわりに "123454\n"としてみて下さい。よくわかると思います。




なお、講義時にも述べましたが、Perlのスカラー変数には型がありません。 文字列でも数値でも扱うことができます。例えば $a に文字列 123 が格納されているとき、 $a + 3 などという式を書くと、文字列を十進数の数値と解釈して計算してくれます。 C言語のように型を変換する必要はありません。状況に応じて適当に解釈されます。 注意するべきなのは、比較の時です。ふたつの値を「文字列」として比較するのか「数値」として比較するのか、 用いる演算子が変わってきます。言い換えれば使う比較演算子によって、型を指定するわけです。


出力の工夫

前回に引き続き data.txtを使った作業を行います。

最終課題1

最高得点を求めるスクリプトを作りなさい。
ヒント(マウスでこのあたりを選択して見て下さい)
最高得点を記録するための変数$topを用意します。 データを読み込んで、それが受験した学生のデータであれば、 その得点(仮に $tokuten に値が格納されているとします) と$topの値を比較し、 $tokuten > $top であるとき、$topの値をその得点で 置き換えます。 これを繰り返せば最高得点がえられます。


最終課題2

得点を10点きざみで10段階(0〜9, 10〜19, 20〜29, ……, 80〜89, 90〜100) にわけて、おのおのの段階に属す学生の数を求めるスクリプトを作りなさい。 またその結果を元に、分布表を作りなさい。
ヒント
各段階の人数を記録するための配列@ninzuuを用意して、 最初はどの段階も0人に初期化しておきます:
  @ninzuu = (0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0);
$ninzuu[0]が0〜9の段階の人数、 $ninzuu[1]が10〜19の段階の人数、 …………、 $ninzuu[8]が80〜89の段階の人数、 $ninzuu[9]が90〜99の段階の人数、 $ninzuu[10]が100〜の段階の人数(ここは実際にはない) と考えます。
データを読み込んで、それが受験した学生のデータであれば、対応する段階の $ninzuu[?]を1だけ増やします。ここで、?の部分は 学生の得点を10で割って、その結果に対しint関数を使って整数部分を求めることにより 見つけ出します。


最終課題3

課題2の結果を棒グラフで表したいと思います:bunpu.html
data.txt を読み込んでこのようなHTMLファイルを自動的に出力するようなスクリプトを作りなさい。


ヒント:ダブルクォーテーション(")を含む文字列を print するときは、 それが文字列の終わりだと解釈されないように注意をしなければなりません。 次のように"の前にバックスラッシュまたは半角の円マークを書きます:
print "<html>
<head>
<title>得点分布</title>
</head>
<body bgcolor=\"#FFFFFF\">
<h1>得点分布</h1>

<table>
";
次のように記述すると文字列の中にダブルクォーテーション(")が あってもそれを気にする必要がありません。
print <<"HERE";
<html>
<head>
<title>得点分布</title>
</head>
<body bgcolor="#FFFFFF">
<h1>得点分布</h1>

<table>
HERE
最初のところで文字列の終わりを示すキーワード(上の場合はHERE)を指定し、 文字列の終わりにそのキーワードだけを含む行を置きます。キーワード以外の文字 やスペースを書いてはいけません。


最終課題4

data.txt の結果を棒グラフで表したいと思います: ichiran.html
data.txt を読み込んで、このようなHTMLファイルを自動的に出力するようなスクリプトを作りなさい。

最終課題5

最後の問題はPerlと直接関係はありません。 教科書を参考にして、「テーブル(表)」「スタイルシート」「フレーム」「JavaScript」などのうちの いくつかを使った面白いページを作って下さい。




すべての課題に挑戦してください。 これ以外でも、なにか自分で面白いスクリプトができたら、それらも載せてください。 締切は1月10日(土)17:00とします。 課題をどのように解いたか、「すべて自分でやりました」「M03-XXXの人に少しヒントを貰いました」 「M03-XXX, M03-YYY, M03-ZZZの3人と協力しました」などをはっきり正直に書いて下さい。