Lecture on Programming I 5/10
Menu Menu
先週の復習
typing の練習 script とメールの使い方Perl のマニュアル
Perl5 man Perl5 のマニュアル(日本語)
Typing の練習
今日も typing の練習をすること (20分)結果をscript でメールすること。
% script
% typist
% exit
% Mail...
整形した結果を、
Subject: Report on Programming I 5/10-typist
というサブジェクトで、kono@ie.u-ryukyu.ac.jp までメールを出すこと。
ファイルの作り方、見方、消し方
emacs
ls
less
rm
mv
ls -l
Unix では、なるべくいろいろなツールを組み合わせる文化がある。
Henon アトラクタを計算してみよう。
#!/usr/local/bin/perl5
$x = 0.2;
$y = 0.3;
for($i=0;$i<10000;$i++) {
printf("%1.3g %1.3g\n",$x,$y);
($x,$y) = (1.0+$y-1.4*$x*$x,0.3 * $x);
}
これを、 henon.pl として、
% perl5 henon.pl > output.henon
% gnuplot
gnuplot> plot "output.henon"
としてみよう。( > は、プログラムの出力をファイルに切替えるための記号。redirect または、output redirect と呼ばれる。)
gnuplot がない場合は、pw に ssh で remote login して実行する。
% scp -v henon.output pw006:~
% ssh pw006
pw006 で、
% gnuplot
WWW から、henon.pl を、コピーする方法をマスターしよう。
ディレクトリの作り方、見方、消し方
mkdir
cd
rmdir
rm -r
いま、作成したファイルをすべて、「prog1」というディレクトリにコピーしよう。
% mkdir prog1
% mv * prog1
それを、すべて消そう。
% mkdir prog2
% rm -rf prog2
消したファイルは、取り返しつきません。
ファイルのパス
ls /usr/local/bin
Working Directory
必ず、新しくディレクトリを作ってから、仕事をする。
そのディレクトリに何があるかをメモする。
練習
Emacs の日本語チュートリアルを保存するチュートリアルを cp で二つ作る
less で中身を確認する
mkdir で新しいディレクトリを作る
cd で、そこに移る
先に作ったチュートリアルをそのディレクトリに移す
ls を使って、
自分のホームディレクトリ
今作ったディレクトリ
を表示する。ls の -R オプションを試して見る
ファイルを消す
cd で一つ上のディレクトリに移る
rmdir でディレクトリを消す
全ての作業は、ディレクトリを作ることから始めること
Indentation (段つけ)
K&R style Kernel styleなどがあるが、どれか統一してあれば、Ok。
while (<>) {
...
}
if ($a==3) {
....
} elsif ($a<0) {
...
} else {
...
}
必ず、この形を使う。これにより、制御構造の見通しが良くなる。
問題
自分の書いたプログラムを、この形に indent しなおせ。
(Emacs を使う)
Emacs の技を追求しよう。
日本語の入力の方法
*** きれいなプログラムを書くための、いくつかのヒント
if 文のネストを複雑にしない
Emacs の機能を使う
プログラミングの勉強について
本を読もう!
人のをコピーしても良いが、ちゃんと理解すること
人のプログラムをけなそう!
動作をちゃんと全部理解しているか?
できたからといって満足しない。さらに良くするには?
変数への代入の復習
文字列とは何か?
改行の取扱 "\n" について理解する。
日本語の取り扱い
JIS は、Perl では扱いにくいので、EUC を使うこと
配列
配列は、数字から値への対応を提供する。順序のあるデータの集まりの表現に便利である。
DB<2> @a = (a,b,c,d,e)
DB<3> p $a[1]
b
DB<4> @b = (1,2,3,4)
DB<5> @c = (@a,@b)
DB<6> p "@c"
a b c d e 1 2 3 4
DB<7>
さまざまなループ
二つの形
while(<>) { print; }
print while(<>);
while と for の使い分け
$max = 100;
$i=0;
while($i < $max) {
print "$i ";
$i++;
}
と、
for($i=0;$i < $max; $i++) {
print "$i ";
}
は、同じ。
問題
上の例題では、表示の一番最後に、" " 空白が入ってしまう。これは、美しくない。最後に、余計な " " が入らないようなプログラムを書いてみよ。
print join(" ",0..$max);
というのが一番短いが... while と for を使ってプログラムして見よう。
ヒント: 最初か、最後を特別扱いすればすれば良いのだが...
作成したプログラムは、$max=0 or $max=1 の場合にも動作するか?
配列と for 文
for文で配列を処理するのが一般的。
for $i ( @a ) {
print "$i\n";
}
for($i=0;$i<$#a; $i++) {
print "$i $a[$i]\n";
}
Perl のプログラムに与えられる引数は配列の形で与えられる。
問題
引数の3番目を表示するプログラムの挙動を調べよ。
#!/usr/local/bin/perl5
print $ARGV[3];
引数が3つない場合は、どのように振る舞うか?
与えられた引数の指定された番号番目を表示するプログラムを作れ。
% argn.pl 3 kono yamada nakamura hoshino
hoshino
%
問題
Perl のマニュアルを調べて、配列の長さを調べる方法を示せ。
(ヒント perldata )
問題
Perl のプログラムに与えられた引数を逆順に表示するプログラムを作成せよ。Perl のプログラムに与えられた引数で指定された数だけ四角を書くプログラムを作成せよ。
ex. perl5 squares.pl 1 2 5 □ □□ □□□□□ヒント: □を表示するのは、print "□"; でよい。"\n" を使って、うまく改行をいれよう。
連想配列
連想配列は、文字列から値への対応を提供する。集合などの表現に便利である。
DB<7> $a{'kono'} = kono
DB<8> $a{'key'} = value
DB<9> p "%a"
%a
DB<10> p %a
keyvaluekonokono
DB<11> p join(" ",%a)
key value kono kono
DB<12>
のように定義する。
join って何かを、マニュアルで調べてみよう。
perldoc -f join
削除する時には delete を使う。
DB<13> delete $a{'kono'}
DB<14> p join(" ",%a)
key value
DB<15>
key は、keys という関数で取り出すことができる。連想配列全体を処理するには、
for $i ( keys %a ) {
print "$i -> $a{$i}\n";
}
などとする。
last と next
ループの仕切り直し、脱出
ファイルを一行一行処理するwhile文、
while(<>) {
....
}
を使って、
メールのヘッダのみを表示するプログラム
メールのボディのみを表示するプログラム
を書いてみよう。ボディとヘッダの境目は、
$_ eq "\n"
でチェックすることができる。
メールは、pw で、show を使って表示することができる。(これは、MH と呼ばれるメールを操作するアプリケーション)
show next
show last
show prev
show +inbox | perl5 header.pl
show +inbox | perl5 body.pl
(| は、pipe と呼ばれる記号で、プログラムの出力を、別なプログラムの入力に接続する。)
while(<>) {
last if ($_ eq "\n");
}
do until
先にテストする? 後にテストする?
while は、先にテストするループ構造であるが、do until は、後でテストをする。ループの中で、終了条件を生成する場合に適している。
getc を使って、一文字ずつ読み込んで、特定の文字がきたら終了する。
do {
$a=getc;
} until ($a eq "a");
flag の使い方
メールのヘッダとボディの行数を表示するプログラムを作ろう。
番兵君の使い方
サブルーチン
subroutine
Perl では、
sub add {
my ($add) = @_;
$sum += $add;
print "test $sum\n";
}
という形で、サブルーチンを定義する。
add(5);
print "$sum\n";
add(10);
print "$sum\n";
add(-10);
print "$sum\n";
add(5);
print "$sum\n";
を実行してみて、何をしているのか理解しよう。
局所変数
my ($add) = @_;
は、局所変数を定義している。
$add = 555;
add(5);
add(10);
add(-10);
add(5);
print "$sum\n";
print "$add\n";
の動作を確認しよう。
*** きれいなプログラムを書くための、いくつかのヒント
長いプログラムは、サブルーチンを使って分割する
課題
以上の課題を、
Subject: Report on Programming I 5/10というサブジェクトで、kono@ie.u-ryukyu.ac.jp までメールを出すこと。