第10回 今までの知識を総動員して、Data::Dumperを理解する

use strict は、 CPANからなにも落としてこずに使えるように、

Data::Dumperも、

use Data::Dumper; と書けば、
Perlに組み込まれているので使えます。

こいつは、すこぶる便利です。もう手放せない。
Rubyのp や、 PHPのprint_r みたいな機能です。


使い方を見てみましょう。

use strict;
use Data::Dumper;

my @array = ('a', 'b', 3, 'z');
my %hash  = ('i'=>'い', 'j'=>'じぇー', 'k'=>'けー');

print "---------\n";
print Dumper \@array;

print "---------\n";
print Dumper \%hash;

結果:

---------
$VAR1 = [
          'a',
          'b',
          3,
          'z'
        ];
---------
$VAR1 = {
          'k' => 'けー',
          'j' => 'じぇー',
          'i' => 'い'
        };

おお 超きれい!!!
このように Data::Dumper は、変数の中身を取得してくれます。
print Dumper で、変数の中身を見やすく表示できるのです。デバッグにかなり役立ちます。

また、これはデバッグだけでなくログに処理途中の変数の値を出力することなどで、プログラムがちゃんと動いていることを確かめるのにも役立ちます。


さて、このDumper なのですが、これは Dumperという名前の関数です。


関数に「配列」や「ハッシュ」といったまとまった値を渡すときには注意がいるのを覚えているでしょうか?
第7回 関数というかサブルーチン - bingo_nakanishiの他言語出身者のためのPerl入門

ビンゴ中西のほげほげ君のプログラムスタイルを抜本的に変える方法
このリンクさきに書いてあります(リンク先で申し訳ないのですが)。


この「配列」と「ハッシュ」はリファレンスにして渡してあげないと、まとまった値として受け取った関数の側がみてくれません。

じつは、これは、受け取る関数側の問題ではなく、
「関数呼び出し」のところをじっくり見てみると、

my @array = (1,2,'z');

hoge(@array);

↓

hoge(1,2,'z');  # このように展開される つまり引数を3つ与えたのと同じ

こういう解釈がされています。 ですから、この展開をさけるために「たったひとつ」であることを示すリファレンスで渡さなければいけません。
ですから、
Dumper には \@array や \%hash というように、 リファレンス渡しにしているのです。

もし次のように Dumperに渡してしまうと、

use strict;
use Data::Dumper;

my @array = ('a', 'b', 3, 'z');
my %hash  = ('i'=>'い', 'j'=>'じぇー', 'k'=>'けー');

print "---------\n";
print Dumper @array;  # \ をとった

print "---------\n";
print Dumper %hash;   # \ をとった

結果:

---------
$VAR1 = 'a';
$VAR2 = 'b';
$VAR3 = 3;
$VAR4 = 'z';
---------
$VAR1 = 'k';
$VAR2 = 'けー';
$VAR3 = 'j';
$VAR4 = 'じぇー';
$VAR5 = 'i';
$VAR6 = 'い';

このように引数を4つと引数を6つもらったように受け取られてしまいます。


では、もういちどリファレンス渡しにしたものを見てみましょう。
(再掲)

use strict;
use Data::Dumper;

my @array = ('a', 'b', 3, 'z');
my %hash  = ('i'=>'い', 'j'=>'じぇー', 'k'=>'けー');

print "---------\n";
print Dumper \@array;

print "---------\n";
print Dumper \%hash;

結果:

---------
$VAR1 = [
          'a',
          'b',
          3,
          'z'
        ];
---------
$VAR1 = {
          'k' => 'けー',
          'j' => 'じぇー',
          'i' => 'い'
        };

これ、 ひとつめの$VAR1の方ですが、

[  ]

で囲まれていますよね。 そうなんです。「無名配列」です。
ふたつめの$VAR1は

{   }

で囲まれていますね。 そうです。 「無名ハッシュ」です。

この「無名シリーズ」覚えていますよね。「無名シリーズ」はリファレンスを返してくる。
つまり、ひとつめの$VAR1は、 リファレンスな配列であることを示している。
ふたつめの$VAR1はリファレンスなハッシュを示している。
それもそのはずです

print "---------\n";
print Dumper \@array;

print "---------\n";
print Dumper \%hash;

というように、Dumper にはリファレンスで「配列」と「ハッシュ」を渡しています。


ということで、このData::Dumper をつかって 超快適なプログラミングをお楽しみください。

参考資料として、こちらもあげておきます。
ビンゴ中西のほげほげプログラムの途中のデータをあとで使う方法


それでは また〜