綾小路龍之介の素人思考

[条件判定]if文の代替

3番目の例について言えば、条件判定にif文を使うのは遅くなる原因だそうな。この場合、\$aがゼロか、\$bがゼロか、\$cがゼロか、という判定をif文で書くのではなく、演算子を使って記述した方が早いということ。変数を||でつないだ場合は左から評価を始めて最初に現れた0でない数字を返す。変数を&&でつないだ場合は左から評価を始めて最初に現れた0を返す。

> perl -wle "print 0||3||1; print 3||1||0; print 1||3||0;"
3
3
1
> perl -wle "(\$a,\$b,\$c)=(0,3,1); \$d=\$a||\$b||\$c; print \$d;"
3
> perl -wle "\@a=map{int rand 3}(0..20); print \@a; print eval(join'||',\@a);"
222112121101120001212
2
> perl -wle "\@a=map{int rand 3}(0..20); print \@a; print eval(join'&&',\@a);"
210100122012201210021
0
>

単体ではほとんど意味をなさないが、このような条件判定は初期値の設定に使える。例えば、引数にディレクトリを取り、そのディレクトリの内容を表示するプログラムを考えてみる。内容を表示したいディレクトリ$dirに下のように代入させることができる。

$dir = $ARGV[0] || './';

ただし、この場合は$ARGV[0]の内容が0や空文字列だった場合には上手くいかない。言い換えれば、0というディレクトリの内容を表示することはできないということだ。もちろん引数に'./0'と指定すれば問題はないが、それではユーザビリティに欠けるというものだ。そんな場合は下のようにするとよいだろう。言い換えれば、引数が指定されていてなおかつ引数の内容が空文字列でない場合、引数をそのまま$dirへ代入、これ以外の場合は、カレントディレクトリを$dirに代入する、ということだ。こうすれば引数に0を指定されたり、コマンドの後に無駄な空白をつけたおかげで引数が定義されてはいるものの意味のない引数(空文字列)だった場合にもまともな結果を返すことができる。

$dir = (defined $ARGV[0] && $ARGV[0] ne '') ? $ARGV[0] : './';

ソーシャルブックマーク

  1. はてなブックマーク
  2. Google Bookmarks
  3. del.icio.us

ChangeLog

  1. Posted: 2007-08-26T17:41:14+09:00
  2. Modified: 2007-08-26T04:05:56+09:00
  3. Generated: 2017-08-07T23:09:16+09:00