ifは使わない

他の手続き型が根本にある言語でも必ずと言っていいほど登場するのが、ifのメカニズム。
そのうち、Perlについては、様々なシンタックスによって置換が可能である。と、言うよりもその方がよかったりする。

基本

Perlでのif文の例は下記のようなもの。

if ( $str eq 'a' ) {
	print 'aだよ'
} elsif ( $str eq 'b' ) {
	print 'bだよ'
} else {
	print 'aでもbでもないよ'
}

注意すべき点は、

  • elseifではなく、elsif。ここだけPerl独自なので注意が必要。SQLにおけるcreateがcreatになった理由と同じかも。想像だけど。
  • {}で囲まれたブロックの最後の命令は、;が要らない。

くらいなものか。

後置

if文はこのようにもかける。

print 'aだよ' if ( $str eq 'a' );

前提として

  • else以降がない。
  • 実行するのは一つの命令だけ

であることが必要。

ifを使わない

もっと短く、そして速度を追求すると、ついにはif文を使わないと言う選択肢にたどりつく。
ラクダ本によると、ifは下記の評価を使う方式に比べるとオーバーヘッドが1000倍以上あるのだとか。ほんとか?
しかし、遅いよりは早いほうがよいので、試す価値はある。

( $str eq 'a' ) and print 'aだよ';

まず、and以前が実行・評価される。これで偽になれば、andの機能としてそれ以降は無視して次の処理に移ることになる。真になれば、and以降も実行される。

( $str eq 'a' ) or print 'aじゃないよ';

こっちはその逆。実際にはこっちの構文の方が使うチャンスが多いだろう。

open ( IN, 'file.txt' ) or die ( 'ファイルが開けねー!' )

Perlの変数・関数・メソッド・ファンクションとか言われる全てのものは、自作も含めてなんらかの値を返すのでできる芸当。引数を除いたら実にわかりやすい構文になる。

open or die
# 開け! さもなくば死ね!

まあ、いきなりdieするよりも、return ();したりする方が建設的かなあ。

三項演算子

これもいい。or/andよりもオーバーヘッドは高いそうだが、ifに比べると知れているそうだ。
通常、三項演算子は以下のように説明される。

$res = ( $str eq 'a' ) ? 'aだよ' : 'aじゃないよ';

三項演算子の各項には条件や定数だけでなく、そのまま関数やメソッドを置けるし、返り値はそのまま捨ててもよいことに気付くと、可能性が広がる。

( $str eq 'a' ) ? print 'aだよ' : print 'aじゃないよ';

ついでに入れ子にもしやすいしね。
どっかのモジュールには、ifが全然ないのもあるそうだし、どっかのコーディング規約には「ifは使うな」と言うのがあるそうだ。そっちの方がコードすっきりした上で早くなるんだったら、従った方がマシだね。