Perlで、ハッシュをprintデバッグする


はじめに

Perlは以前業務で他の人から渡されたソースを読む機会があり、その時のコードがあまりに何やってるかよく分からないコードだったもので、それ以来すっかりPerl恐怖症に。
ずーっと敬遠していたのですが、新しく配属されるプロジェクトでPerlを本格的に使うことになり、いよいよ逃げられなくなりました。
それでもまあ、PHPで言うところのvar_dump()があればどうにかなるだろう、とは思っていたのですが、これが意外と素直に出てこない。
特にハッシュのデバッグがちょっと面倒に感じました。
というわけで、その試行錯誤の果てを自分用に備忘録。

方法1

Perlでは、PHPと違いprintでスカラー値、配列、ハッシュ全て表示出来るとのこと。あら便利。

#!/usr/bin/perl
use strict;
use warnings;

my %members = (
    '西住みほ' => 1023,
    '武部沙織' => 622,
    '五十鈴華' => 1216,
    '秋山優花里' => 66,
    '冷泉麻子' => 91
);

print %members;

実行結果

秋山優花里66西住みほ1023五十鈴華1216冷泉麻子91武部沙織622

怒涛の横一列。
表示は確かに出来るけど、これじゃあいくらなんでも、てもの。

方法2

Perlでは、配列やハッシュをprintする際に区切り文字が指定出来るとのこと。
$,という特殊変数を定義してあげればいいようです。

#!/usr/bin/perl
use strict;
use warnings;

my %members = (
    '西住みほ' => 1023,
    '武部沙織' => 622,
    '五十鈴華' => 1216,
    '秋山優花里' => 66,
    '冷泉麻子' => 91
);

$, = "\n";
print %members;

実行結果

西住みほ
1023
冷泉麻子
91
武部沙織
622
秋山優花里
66
五十鈴華
1216

さっきよりは見やすくなったものの。。。という感じです。
そもそもこの数字は「数値」なのか「文字列」なのか、そこも不明。
その証拠に、%members

my %members = (
    '西住みほ' => '1023',
    '武部沙織' => '622',
    '五十鈴華' => '1216',
    '秋山優花里' => '66',
    '冷泉麻子' => '91'
);

とvalueを文字列に置き換えてみても、結果はこう。

武部沙織
622
秋山優花里
66
冷泉麻子
91
五十鈴華
1216
西住みほ
1023

変わってませんね。
ちなみに順番が違うのは、Perlのハッシュが順番を保持しないから。

方法3

Data::Dumperを使う方法。
Dumperを使う際は、printだけでなく、print Dumperと書く。

#!/usr/bin/perl
use strict;
use warnings;
use Data::Dumper;

my %members = (
    '西住みほ' => 1023,
    '武部沙織' => 622,
    '五十鈴華' => 1216,
    '秋山優花里' => 66,
    '冷泉麻子' => 91
);

print Dumper %members;

実行結果

$VAR1 = '冷泉麻子';
$VAR2 = 91;
$VAR3 = '秋山優花里';
$VAR4 = 66;
$VAR5 = '武部沙織';
$VAR6 = 622;
$VAR7 = '西住みほ';
$VAR8 = 1023;
$VAR9 = '五十鈴華';
$VAR10 = 1216;

さっきよりは良い感じです。
ハッシュのvalueに該当する箇所を文字列に置き換えてみます。

my %members = (
    '西住みほ' => '1023',
    '武部沙織' => '622',
    '五十鈴華' => '1216',
    '秋山優花里' => '66',
    '冷泉麻子' => '91'
);

実行結果

$VAR1 = '武部沙織';
$VAR2 = '622';
$VAR3 = '冷泉麻子';
$VAR4 = '91';
$VAR5 = '西住みほ';
$VAR6 = '1023';
$VAR7 = '五十鈴華';
$VAR8 = '1216';
$VAR9 = '秋山優花里';
$VAR10 = '66';

ちゃんと文字列と数値が区別されています。
せっかくなので、key => valueな関係をもう少し見やすく出来ないものかと。

方法4 (解決策)

Data::Dumperを使い、かつハッシュを無名ハッシュとして一度変数に代入し、それをprintする方法。

#!/usr/bin/perl
use strict;
use warnings;
use Data::Dumper;

my %members = (
    '西住みほ' => 1023,
    '武部沙織' => 622,
    '五十鈴華' => 1216,
    '秋山優花里' => 66,
    '冷泉麻子' => 91
);
my $membersRef = {%members};

print Dumper $membersRef;

実行結果

$VAR1 = {
          '冷泉麻子' => 91,
          '武部沙織' => 622,
          '秋山優花里' => 66,
          '五十鈴華' => 1216,
          '西住みほ' => 1023
        };

これですよこれ!文字列でやってみます。

$VAR1 = {
          '秋山優花里' => '66',
          '西住みほ' => '1023',
          '冷泉麻子' => '91',
          '武部沙織' => '622',
          '五十鈴華' => '1216'
        };

完璧ですね。これで一件落着。

結論

  1. Data::Dumperを使う。
  2. ハッシュは無名ハッシュとして一度変数に代入。
  3. 代入しておいた変数をprint Dumperする。

おわりに

Perlを触り始めてまだ日が浅いのですが、慣れるまでは時間が掛かりそうな予感。
あとは実際のコードに触れながらやっていくしかありませんね。とほほ。

改めてPHPって便利な言語だったなと。。
ただクイックソートなど、PHPとPerlで同じようなコードを書いてみたら、Perlの方が体感で分かるほど圧倒的に早かったので、使いこなせたらそれはそれで幅が広がりそうです。
あとはPerlの醍醐味は文字列処理にあるらしい?ので、そこも慣れていきたいです。

何か間違いなどあれば、ご指摘頂けると有り難いです。