Lecture on Programming I 4/27
Menu Menu
先週の復習
Mule について Netscape の使い方 Unix Basics 始めてのPerl
typing の練習を20分
script の使い方
% script % typist % exit % less typescriptscript を整形する
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/j00003pw の 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 hogehogeは、なんでもいい。保存したい情報を残しておくためのファイル名です。省略したときには、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