文字っぽいの。

文字を書いています。写真も混ざります。

Perlのprintデバッグをシュッと見やすくする

 この記事は、Perl Advent Calendar 2014 - Qiita の6日目の記事です。(※初学者向け)

シュッと変数の様子を見る

 Perlでプログラムを書いていて、「ここの変数なにが入ってるのかな?」と調べたい場合、このようにprintで表示させるプログラムを書くと

use strict;
use warnings;

my @array = (1, 2, 3, 4, 5);
my $array_ref = [@array];

my %hash = (
            name => "tarou",
            age => 20,
        );
my $hash_ref = {%hash};


print @array, "\n"; # => 12345
print %hash, "\n";  # => nametarouage20

print $array_ref, "\n"; # => ARRAY(0x7fd949828318)
print $hash_ref, "\n";  # => HASH(0x7fd94983d160)

1;

 このように、素朴な出力がされます。さすがにこれは見にくいですし、わざわざforeachを回すというのも面倒なので、以下の方法でシュッと出します。

解決法

 Data::Dumperを使います。

use strict;
use warnings;
use Data::Dumper;

my @array = (1, 2, 3, 4, 5);
my $array_ref = [@array];

my %hash = (
            name => "tarou",
            age => 20,
        );
my $hash_ref = {%hash};

print Dumper @array;
print Dumper %hash;

print Dumper $array_ref;
print Dumper $hash_ref;

1;

 こんな感じに、Dumperをかませてあげます。結果は以下のようになります。

# print Dumper @array; の結果
$VAR1 = 1;
$VAR2 = 2;
$VAR3 = 3;
$VAR4 = 4;
$VAR5 = 5;

# print Dumper %hash; の結果
$VAR1 = 'name';
$VAR2 = 'tarou';
$VAR3 = 'age';
$VAR4 = 20;

# print Dumper $array_ref; の結果
$VAR1 = [
          1,
          2,
          3,
          4,
          5
        ];

# print Dumper $hash_ref; の結果
$VAR1 = {
          'name' => 'tarou',
          'age' => 20
        };

 これでprint単体で使った時よりも分かりやすく変数の中身が表示されるようになりました。文字列と数値の差も分かって安心。

マクロでシュっとData::Dumperを使う

 Data::Dumperを使うことで、printデバッグが捗るようになりました。しかし、毎回

use Data::Dumper;
print Dumper $hoge;

と書くのは非常に面倒です。あと、だいたい忘れます。そこで、smartchrを使います。smartchrEmacsでもVimでも使えるので安心。

設定

Emacsであれば、imakado/emacs-smartchr · GitHubをinstallした後で、

(require 'smartchr)
(add-hook 'cperl-mode-hook
          '(lambda ()
             (progn
               (local-set-key (kbd "D") (smartchr '("D" "use Data::Dumper; warn Dumper ")))
               )))

と設定してあげます。設定が反映された後は、DDと打つとuse Data::Dumper; warn Dumperがシュッと出るようになります。

シュッと出る様子

シュッと見つける

 iTerm2を使っている人専用です。iTerm2では特定のキーワードをハイライトしてくれる機能があります。Webアプリ開発をしていると、アクセスログが大量にコンソールに流れてきて、どこにデバッグ用の出力があるのかわからなくなります。

 iTerm2のPreferences->Profiles->Advancedに行き、Triggersのeditを選んで設定してあげます。

f:id:FromAtom:20141206172826p:plain

 こんな感じで設定すると、ハイライトされます。また、通知やアイコンのバウンス等もできるので大変便利です。

シュッと見つかる様子

 こんな感じに、$VARに色がつくので、簡単に見つけることが出来ます。

f:id:FromAtom:20141206172846p:plain