2008-04-01から1ヶ月間の記事一覧

4. Iterators (Permutation)

リストの全組み合わせを作る方法。 HOPの内容ではないけど、役に立つのであげておこう。 #!/usr/bin/env perl use strict; use warnings; sub permute { my @items = @{ $_[0] }; my @perms = @{ $_[1] }; unless (@items) { print "@perms\n"; } else { my …

1. Recursion and Callbacks(fib)

この手の話題で定番のフィボナッチ数列 #!/usr/bin/env perl use strict; use warnings; sub fib { my ($n) = @_; if ($n == 0 || $n == 1) { return 1; } else { return fib($n-1) + fib($n-2); } } print fib($ARGV[0]) . "\n"; 試しに35ぐらいをしてみる…

1. Recursion and Callbacks(dir_walk)

ちょっと復習。。。 この章では、再帰的な処理中に何かにぶつかったときにある処理をさせたい、と言うことを効率的にやる方法が書かれている。 一例はこの通り。 #!/usr/bin/env perl use strict; use warnings; sub dir_walk { my ($top, $code) = @_; my $…

4. Iterators(upto)

Iteratorって何の役に立つんじゃい!!なんて思ってたけど、読んでみると遅延評価そのままやん!! とりあえず本に書いてあった利点をリスト。 巨大なリストを作らなくて済むので省メモリ 深さ優先、幅優先のどちらでも探索が可能(再帰だと深さ優先になる) …

3. Memoization

何回もコールされるような関数はメモ化するに限る。でも、副作用のない状態にしておかないと当然ダメ。 #!/usr/bin/env perl use strict; use warnings; use Memoize; memoize 'fib'; sub fib { my ($n) = @_; if ($n == 0 || $n == 1) { return 1; } else {…

2. Dispatch Tables

条件分岐にDispatch Tableを使うことで 巨大なif-else文を排除できる。 Additiveにできる(これはSICPに書いていることだけど) などの利点がある。あんま使ったこと無いけど、使いかたを覚えればかなり便利そう。 #!/usr/bin/env perl use strict; use warnin…

寝返り

お父さんがちゃんと成長日記を書いてくれていないようなので少しお邪魔します前までは「頑張れ頑張れ!!」って感じの寝返りと言うよりは体ねじりって感じだったのが 今日からスムーズにコロンとうつ伏せになり、うれしそうに笑っています。 まだハイハイは…

2.14 Else

}とelseを同じ行に並べない。 if (cond) { # ... } else { # ... }

2.12 ブロック

2つの文を1行にまとめない。

2.13 チャンク化

コードを段落に分ける。

2.10 インデント

4列のインデントレベルを使用する。

2.11 タブ

インデントにはタブではなくスペースを使用する。 .emacs(cperlモード) (defalias 'perl-mode 'cperl-mode) ;; cperlモードでのスペース4つのインデント '(cperl-close-paren-offset -4) '(cperl-continued-statement-offset 4) '(cperl-indent-level 4) '(c…

2.9 行の長さ

78列の行を使用する。 Emacs (setq fill-column 78) (setq auto-fill-mode t)

2.8 コンマ

複数行にまたがるリストの各値のあとにコンマを配置する。 my @darves = ( 'Happy', 'Sleepy', );

2.7 セミコロン

全ての文の後ろにセミコロンを配置する。 while (my $line = <>) { chomp $line; if ( $line =~ s{\A (\s*) -- (.*)}{$1#$2}xms ) { push @comments, $2; } print $line; }

2.6 演算子

ホワイトスペースを使用して、2項演算子をオペランドから際立たせる。 my $displacement = $initial_velocity * $time + 0.5 * $acceleration * $time**2;

2.5 キーとインデックス

複合キーやインデックスを周囲のかっこから分離する。 $candidates[$i] = $incumbent{ $candidates[$i]{ get_region() } }:

2.4 組み込み関数

組み込み関数や「名誉」組み込み関数のために、不要なかっこを使用しない。 while (my $record = <$results_file>) { chomp $record; my ($name, $votes) = split "\t", $record; print 'Votes for ', substr($name, 0, 10), #優先度を適用するには、かっこが…

2.3 サブルーチンと変数

サブルーチンまたは変数の名前を後続の開きかっこから分離しない my @candidates = get_candidates($marker); CANDIDATE: for my $i (0..$#candidates) { next CANDIDATE if open_region($i); $candidates[$i] = $incumbent{ $candidates[$i]{region} }; }

2.2 キーワード

制御キーワードを後続の開きかっこから分離する for my $resut (@results) { print_sep(); print $result; } while ($min < $max) { my $try = ($max - $min) / 2; if ($value[$try] < $target) { $max = $try; } else { $min = $try; } }

2.1 かっこ

かっこと中かっこにK&Rスタイルを使用する my @names = ( 'Damian', 'Matthew', 'COnway', ); for my $name (@names) { for my $word ( anagrams_of(lc $name) ) { print "$word\n"; } }

Chapter1: Recursion and Callbacks

この章はRecursionとCallback(Sub Routine Reference)に慣れましょう。と言うのが主な主題(本当かよ!!)。 すなわち、より多くのケースで使えるような汎用的な関数を作るためには、どうしたらよいか!! 例えば、あるデータを処理して、その結果をあるときはテ…

1日の時間

自由に使える時間はどのくらい? 5:30 : 起床。でも、最近は45分ぐらいまでダラダラ。 5:50 - 6:15: 朝食 6:15-6:25: ボォーと。 6:25-6:40: チャリ通 6:45-7:00: 電車通 7:00-7:30: 徒歩通 7:30-20:00: 仕事 20:00-20:20: 徒歩通 20:20-20:40: 電車通 20:40-…

16.22 シグナルを致命的エラーに変換する

捕捉するように設定していないシグナルが原因となってプログラムが強制終了させられる場合、通常はENDブロックが実行されない。 sigtrapプラグマを使用する use sigtrap qw(die untrapped normal-signals);

16.21 動作のタイムアウト

動作が一定の長さの時間を超えて実行され続けることのないようにしたい。 SIGALARMハンドラを設定して、dieを呼び出す。 eval { local $SIG{ALARM} = sub { die "alarm clock restart" }; alarm 10; # アラームを10秒に設定する eval { # 実行するのに時間の…

16.20 シグナルをブロックする

シグナルの受け取りを遅らせたい。その目的は、任意の時点でプログラムに割り込む可能性のあるシグナルによって、予想外の動作が引き起こされるのを防止するためである。 sigprocmaskシステムコールに対するPOSIXモジュールのインターフェースを使用する。 u…

16.19 ゾンビプロセスの蓄積を防ぐ

終了した子プロセスの状態を確認する必要がない場合 $SIG{CHLD} = 'IGNORE'; 終了したプロセスの状態を意図的に確認する必要がある場合 use POSIX ":sys_wait_h"; $SIG{CHLD} = \&REAPER; sub REAPER { my $stiff; while (($stiff = waitpid(-1, WNOHANG)) >…

16.17 シグナルハンドラを書く

16.18 Ctrl+Cを捕捉する

SIGINTに対応するハンドラを設定する。 $SIG{INT} = 'IGNORE'; 何らかの処理を行う場合 $SIG{INT} = \&tsktsk; sub tsktsk { $SIG{INT} = \&tsktsk; warn "\aThe long habit of living indisposeth us for dying.\n"; }

16.16 シグナルハンドラを一時的に上書きする

localを使用して、シグナルの動作を一時的にオーバーライドする # シグナルハンドラ sub ding { $SIG{INT} = \&ding; warn "\aEnter your name!\n"; } # 名前の要求をするために、SIGINTをオーバーライドする。 sub get_name { local $SIG{INT} = \&ding; my…