It's raining cats and dogs.

無駄なことなんてないはず

perlがスクリプトをどのように解釈しているのかを知るためのB::Deparseなるものを知った

僕のperlの先生monmonさんに今日もまた教えてもらった。

perlがどのようにスクリプトを解釈しているのかを事前に知ることのできるB::Deparseというものがあるらしい。

↓のサイトを参考にさせていただいた。
http://www.g-ishihara.com/perl/compiler01.html

B::Deparseってのは、perlスクリプトをコンパイルして、そこから更にソースコードを生成(デコンパイル?)するらしい。なのでperlがどのようにそのスクリプトを解釈しているのかってのがわかるとか。

ちなみにBモジュールってのはperlコンパイラ系のモジュールで、Oモジュールってのはそのモジュールを操作するためのインターフェースみたいなものとのこと。

ではやってみる。

$ perl -MO=Deparse -e 'use constant HOGE => 1;print HOGE;'
use constant ('HOGE', 1);
print 1;
-e syntax OK

HOGEが展開されてprint 1となっている。

↓はmonmonさんに教えてもらった内容。ループの中で何かの計算をして$xに値を入れている。ループのたびに計算して効率の悪そうな感じなのだけど、Deparseすると、コンパイル時点で既に計算されているので、そんなに効率は悪くないことがわかる。

$ perl -MO=Deparse -e 'for my $i (0..100){my $x = 60*60*24;}'
foreach my $i (0 .. 100) {
    my $x = 86400;
}
-e syntax OK

ちなみにこのforはリストコンテキストなので、foreachになっていることもわかった。

あと面白いのが↓

$ perl -MO=Deparse -e 'use constant DEBUG => 1;if(DEBUG){print "debug";} print "done."'
use constant ('DEBUG', 1);
do {
    print 'debug'
};
print 'done.';
-e syntax OK

よくあるデバッグフラグみたいなものを定数に入れていて、if文で判定してデバッグモードだったらほげほげみたいな処理。
これはif文の判定すらなくなっている。

こんな感じでコンパイル具合がわかるので、これからはちょいちょい使ってみたい。