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 までメールを出すこと。


Shinji KONO / Sun May 20 01:04:21 2001