Hatena::Groupsubtech

NaN days

ブログを移転しています。最新の記事は motemen.hatenablog.com へどうぞ

2012-02-08

プログラムの出力をコメントとして埋め込んでくれる Perl モジュールを書きました

| 21:08 | プログラムの出力をコメントとして埋め込んでくれる Perl モジュールを書きました - NaN days を含むブックマーク はてなブックマーク - プログラムの出力をコメントとして埋め込んでくれる Perl モジュールを書きました - NaN days

2012-10-24 追記: 名前を変え、Devel::Comment::Output という名前で shipit しております。

簡単なテストスクリプトやベンチマークを実行したときなどその結果をファイルに書き足したいときがありますが、それを自動でやってくれるモジュールを書きました。

no title

動作例

基本的には use するだけです。

use strict;
use warnings;
use Acme::Annotate::WithOutput;
use Data::Dumper;

print 1+2; 
print Dumper { a => 1 };

use Benchmark 'cmpthese';

cmpthese(100, {
    foo => sub { 1+1 },
    bar => sub { 1*1 },
});

というスクリプトを実行するとファイルの内容が書き変わり、以下のように標準出力に出力された内容がコメントとして埋め込まれます。モジュール自身の use はコメントアウトされます (thanks to @suzak)。

use strict;
use warnings;
# use Acme::Annotate::WithOutput;
use Data::Dumper;

print 1+2; # => 3
print Dumper { a => 1 };
# $VAR1 = {
#           'a' => 1
#         };

use Benchmark 'cmpthese';

cmpthese(100, {
    foo => sub { 1+1 },
    bar => sub { 1*1 },
});
#             (warning: too few iterations for a reliable count)
#             (warning: too few iterations for a reliable count)
#                     Rate bar foo
# bar 100000000000000000/s  --  0%
# foo 100000000000000000/s  0%  --

以下のようにすることで、標準エラー出力を埋め込むこともできます。

use Acme::Annotate::WithOutput handle => \*STDERR;

しくみ

STDOUT を適当に tie() したオブジェクトで置き換え、その PRINT メソッドが呼ばれる時に出力される内容を溜め込んでいます。caller() でスクリプトの何行目から呼ばれたかが分かるので、あとからその場所にコメントを挿入すれば終わり。