18
12

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

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

Posted at

#はじめに
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の醍醐味は文字列処理にあるらしい?ので、そこも慣れていきたいです。

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

18
12
5

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
18
12

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?