読者です 読者をやめる 読者になる 読者になる

詩と創作・思索のひろば

ドキドキギュンギュンダイアリーです!!!

いい感じに出力をインデントしてくれるモジュール #perl

Perl

[2013-11-20: Print::IndentedがCPANになくてしょんぼりしている。 とのことで shipit いたしました。 あざーす!]

過去のよく分からないコードの挙動を把握したいときには print (warn) するのが少なくともとりあえずの方法としては常套手段ですが、これがただ平坦に画面に現れるだけだと見づらい。例えば条件分岐やループの中にいる時は出力をインデントするようにすると動きが掴みやすくなるけれど、ただでさえ人間に単純労働を課す print デバッグにそこまで労力を使うのは辛い。そういう面倒さを減らそうという動機で、このモジュールは書かれました。

https://github.com/motemen/perl5-Print-Indented

一体何をするのかというと今書いた通りですが、print 時に、その print 関数の呼び出しコードのインデントに応じて、出力自身もインデントされるようになります。

つまり、

# a.pl
use strict;
use warnings;

warn 'blah starts';

for my $i (1..3) {
    warn "i: $i";
}

warn 'blah finished';

を普通に実行すると以下のようになりますが、

% perl a.pl      
blah starts at a.pl line 5.
i: 1 at a.pl line 8.
i: 2 at a.pl line 8.
i: 3 at a.pl line 8.
blah finished at a.pl line 11.

これが

% perl -MPrint::Indented a.pl
blah starts at a.pl line 5.
    i: 1 at a.pl line 8.
    i: 2 at a.pl line 8.
    i: 3 at a.pl line 8.
blah finished at a.pl line 11.

こうなる。

使い方

基本的には use Print::Indented するだけで、呼び出し元のパッケージから直接 STDOUT および STDERR に出力された文字列が、当該のソース行のインデントに応じてインデントされるようになります。例外として、main パッケージから import された時にはすべてのパッケージからの出力をインデントします。なので「とりあえず -MPrint::Indented する」、という使い方ができます。

ちなみに複数行の出力にも対応していて、

use strict;
use warnings;
use Data::Dumper;
use Print::Indented;

warn Dumper { a => 1 };

{
    warn Dumper { b => 2 };
}

$VAR1 = {
          'a' => 1
        };
    $VAR1 = {
              'b' => 2
            };

ってなります。

リポジトリ 

https://github.com/motemen/perl5-Print-Indented

どうぞご利用ください。