Lecture on Programming I 4/27

Menu Menu


先週の復習

   Mule について 
   Netscape の使い方 
   Unix Basics 
   始めてのPerl 


typing の練習を20分

script の使い方

	% script
	% typist
	% exit
	% less typescript

script を整形する
	M-X replase-string C-Q C-M

自動的に整形するには?

整形した結果を、

    Subject: Report on Programming I   4/27-typist

というサブジェクトで、kono@ie.u-ryukyu.ac.jp までメールを出すこと。


Netscape v47

日本語入力の方法

単語登録の方法

単語はどこに登録されるのか?

辞書をコピーする


マニュアルの読み方

man と man-k 、whatis など。

nirai/kanai には日本語マニュアルがあります。

マニュアルがないときは?

info の使い方

	Mule から
	コマンドから

Perl のマニュアル

Perl5 man Perl5 のマニュアル(日本語) (注) 最新版ではありません


Unix の勉強の方法

マニュアルだけではわからない。しかし、マニュアルを読まなければわからない。

カレンダーコマンドを探してみる

	man -k calendar


Emacs の技

サーチを使う

	incremental-search
	search-forward

日本語でサーチするには?
	(set-keyboard-coding-system *euc-japan*)

を、.mule にいれる

整形コマンド M-q


pw/nw の使い分け

/net/home を使ってみよう

pw から、

	cp file /net/home/y00/j00003

pw の mule を nw の ウィンドウに表示する

	xhost +pw003
	rsh pw003
	mule


Perl の read/eval loop

    #!/usr/bin/perl5
    while(<>) {
	print eval;
    }

というファイルを eval-loop.pl という名前で作成する。

    perl5 eval-loop.pl

で実行する。


さまざまな Perl スクリプトの実行方法

    chmod 755 eval-loop.pl

で、
    ./eval-loop.pl

として実行する。

    mkdir  ~/bin
    cp eval-loop.pl ~/bin
    rehash

として、

    eval-loop.pl

で実行する。


eval-loop.pl の説明

#!/usr/bin/perl5 どのコマンドで実行するスクリプトなのかの指定 (Unixのみ)
while(<>) { 入力を一行読んで $_ に入れる。もし、入力がもうなければ(End of File) while loop を終了する
print eval; print(eval($_)) と同じ。$_ の内容を Perl の文として実行した結果を表示する
} while 文の条件に戻る

while(<>) { ... } は良く使う idiom (慣用句)です。

引数を省略すると $_ が使われることが多い。(要確認)


今日の課題

Perl の基本的な構文を理解しよう。

以下の課題は、cut&paste で、

    Subject: Practice on Programming I   4/27

として kono@ie.u-ryukyu.ac.jp まで提出すること


print 文

	print "test";
	print "test\n";

\n は改行を表す。Unix の場合、ファイルからの入力には必ずこれがついている。

	print;

だと、$_ を表示します。

(1) 自分の名前を Perl に表示させてみよう。

セミコロン; を付けずに、print 文を二つ並べるとどうなるか?


条件文

以下のプログラムをcut & paste を使って実行して条件文に付いて理解せよ。

	$_ = <>;
	chop;        # 改行を切り落とす
	if ($_ eq "Hello") { print "Nice to see you.\n"; }

{} はどういう役割を果たしているか考えよ。() はどうか? 省略すると、どうなるか?

以下のプログラムを実行して条件文に付いて理解せよ。

	$answer = int(rand(100));    # 乱数を発生する
	$_ = <>;
	if ($_ > $answer) { 
	    print "Too large.\n"; 
	} elsif ($_ < $answer) { 
	    print "Too small.\n"; 
	} else {
	    print "Correct.\n"; 
	}

数字として比較するには、>,<,== を使う。文字列として比較する場合は、eq, ne, gt, lt を使う。

(2) "1234345"と"31234" を数字として比較する場合と、文字列で比較する場合の結果を表示し、結果を説明せよ。

(3) 数字として解釈できない文字列を数字として比較するとどうなるか? 試してみて、結果を説明せよ。

(4) while(<>) { ... } を使って、二つ目のプログラムから数字当てゲームを作ってみよ。

当てるまでにかかった回数を表示するにはどうすれば良いか。(ヒント:$i++ を使う)


ループ

Perl には3種類のループがある。

	while(条件) { ... }
	for($i=0;$i<10;$i=$i+1) { ... }
	do { ... } until (条件);

この三種のループを使って、以下のプログラムを作成せよ。一題につき、三つのプログラムを作成する。

(5) 1 から 100 までを一行ずつに表示するプログラム

(6) 100 から 0 までを一行ずつに表示するプログラム

(7) 1,2,3 と順に足していって、10000 を越えた最初の値を表示するプログラム

(8) 数当てゲームの逆。ユーザにhigh またはlow を答えさせ、コンピュータが

	数を当てるプログラム

余裕がある人は以下の問題も解くこと

(9)

    2分法で、$x*$x - 14 * $x + 9 == 0 の近似解を求めるプログラム
	$min, $max 最初に人間が決めておく。
	$min, $max で、与えられた式の値の符号が異なっていることが前提。
		そうでなければ、エラーメッセージを表示する。
	(8) と同じ手法で近似解に到達する。
	$min, $max のちょうど中間は、求める解よりも大きいのか小さいのか?
	$result == 0 で判定しないで、絶対値がある値(0.00001 など)
	より小さくなった時点で止める


連休中の宿題

連休中はノートPCを持ち帰っても構いません。連休開けには必ず、301 に戻すこと。

typist に似たプログラムを Perl で作成する。

ヒント

    Main Loop は、 for($i=0;$i<10;$i=$i+1) { ... } を使う。
    レッスン用のテキストは、前もって変数に入れておく。
    if 文を使って、テキストを選択する。(配列を使っても良い)
    テキストの表示には print 文を使う。
    ユーザの入力の Loop は、while(<>) {...} を使う。
    正しく入力されたかどうかは一行毎に if 文で判定する。
    正解でなければ、同じ文を繰り返す。

余裕があったら
    時間を測りたいときには、どうすれば良いか? perlfunc から探してみよう。
    採点はどうすべきか?
    一文字ずつ判定するためには、stty などの特殊な操作が必要です。
	(僕だったら、stty cbreak を使う)
    fortune を入力テキストとして使うと面白い。

プログラムと実行の様子をscriptでとって整形したものを、
    Subject: Report on Programming I   4/27

というサブジェクトで、kono@ie.u-ryukyu.ac.jp までメールを出すこと。


付録


script の使い方

 % script hoge

hogeは、なんでもいい。保存したい情報を残しておくためのファイル名です。省略したときには、typescriptというファイルに保存されます。

これをうった直後から、

 % exit

までの、コマンドとその結果がhogeに保存されます。

たとえば、

    % script hoge
    % ls
    MH hoge homework tutorial
    % mule
    % perl5
    print "test";
    % exit

とかすると、hogeには、

    % ls
    MH hoge homework tutorial
    % mule
    % perl5
    print "test";

という情報がのこる。

このhogeファイルをメールでおくれば、OK。張り付け方は、mnewsで、

    To: f
    Cc: jahana@cr.ie.u-ryukyu.ac.jpf
    Bcc:
    Subject: f
    --text follows this line--
    ↑
    ここで、C-x i と打つと、
    Insert file: ~/

と挿入するファイル名をきいてきますので、hogeと入力してください。適宜編集して送って下さい。


chmod の使い方

chmodの使い方を簡単載せます。詳しい使い方は、教科書やmanを使って調べてください。

    ------<< ls -l コマンドの出力 >>-------
    (1)	    (2)  (3)    (4)           (5)  (6)         (7)
    drwxrwxr-x   8 j96007   y96j          512 Feb 19  1999 OpenGL
    -rw-rw-r--   1 j96007   y96j         2208 Mar  9  1999 swing1.txt
    (1) ファイルの種類と可能な操作
	d / - 		: ディレクトリ / ファイル
	r / -		: 読み出し可能 / 読みだし禁止 
	w / -		: 書き込み可能 / 書き出し禁止
	x / -	: read 可能 / write 可能 / 実行可能
	1文字目		: ディレクトリかファイルかを示す。
	u(2 〜 4)	: ユーザ(ファイルの所有者)
	g(5 〜 7)	: グループ(同じグループの利用者)
	o(8 〜 10)	: その他
    (2) 被参照数
    (3) 所有者
    (4) グループ名
    (5) ファイルサイズ
    (6) 更新日時
    (7) ファイル名
    -----<< mode の変更 >>-----
    使用方法
    % chmod [Option] <file>
     
    ---全てのユーザに全ての操作を許可---
    pw007: {9} % chmod ugo+rwx swing1.txt
    pw007: {10} % ls -l swing1.txt
    -rwxrwxrwx   1 j96007   y96j         2208 Mar  9  1999 swing1.txt
    ---グループユーザとその他のユーザの全ての操作を禁止---
    pw007: {11} % chmod go-rwx swing1.txt
    pw007: {12} % ls -l swing1.txt
    -rwx------   1 j96007   y96j         2208 Mar  9  1999 swing1.txt

Shinji KONO / Fri Apr 28 17:03:59 2000