第11回 「配列」と「ハッシュ」と「無名配列」と「無名ハッシュ」と

前回は、Data::Dumper を紹介しました。

ということで、これからは変数の中身を見るときは積極的にData::Dumperを使っていきます。


今回は、
「配列」と「ハッシュ」と「無名配列」と「無名ハッシュ」を相互に乗り換える方法を紹介します。


「配列」から「ハッシュ」の例:

use strict;
use Data::Dumper;

my @c = ('x', 'えっくす', 'y', 'わい', 'z', 'ぜっと'); # 配列
my %d = @c;  # 配列を、ハッシュにコピー

print Dumper \@c;

print "----------\n";

print Dumper \%d;

結果:

$VAR1 = [
          'x',
          'えっくす',
          'y',
          'わい',
          'z',
          'ぜっと'
        ];
----------
$VAR1 = {
          'y' => 'わい',
          'x' => 'えっくす',
          'z' => 'ぜっと'
        };

「=>」は「,」とほとんど変わらないということを覚えていらっしゃるでしょうか?
「=>」は「,」とほとんど変わらないので、このように配列からハッシュにしちゃうことが可能です。




では、「配列」から「無名配列」を作りだす方法を紹介します。
厳密にいうと「無名配列」を作りだすというよりも、「配列」のリファレンス取得の別の書き方という認識のほうが正しいかもしれませんが。

まず、
「配列」から「リファレンス」を取得する普通の例:

use strict;
use Data::Dumper;

my @c   = ('x', 'えっくす', 'y', 'わい', 'z', 'ぜっと'); # 配列
my $ref = \@c;  # 普通にリファレンス取得

print Dumper $ref;

結果:

$VAR1 = [
          'x',
          'えっくす',
          'y',
          'わい',
          'z',
          'ぜっと'
        ];

これを、つぎのように無名配列を作る [ ] でやってみる。

use strict;
use Data::Dumper;

my @c   = ('x', 'えっくす', 'y', 'わい', 'z', 'ぜっと'); # 配列
my $ref = [@c];  # 無名配列を作り出す [ ]

print Dumper $ref;

結果:

$VAR1 = [
          'x',
          'えっくす',
          'y',
          'わい',
          'z',
          'ぜっと'
        ];

こんな風に [ ] に配列をいれてしまえば、リファレンスを取得できます。

つぎに、あんまりというか やって欲しくないのですが、つぎのようなトリッキーなものも見かけたことがあります。

use strict;
use Data::Dumper;

my @c   = ('x', 'えっくす', 'y', 'わい', 'z', 'ぜっと'); # 配列

my $ref;
@{$ref} = @c;   # トリッキーすぎる例

print Dumper $ref;

じつは、 デリファレンスするときには、 @ をただつけるのではなく @{$ref} と デリファレンスする対象を { } で囲った方がよい場合があります。
それをいきなり代入部分でつかってしまっています。

@{$ref} = @c;  # $refは@で元にもどせるやつだよ〜 つまりリファレンスだよ〜 Perlさん、よきにはからってー

という意味です。

my $ref = [@c];

せめて、ひとつ前の例のように、[ ]を使って、このようにしてください。



さて、

@{$ref} = @c;

↓

$ref = [@c];

これって、 なんか数学のときにならった、移項を思い出す。
掛け算を移行すると割り算になるし、プラスを移項するとマイナスになる。

デリファレンスを移項すると、リファレンスになる。

とまあ、これは余談です。

つぎのように、

my $ref = [@c];

で、リファレンスを取得できることを覚えればOKです。



同じように、「ハッシュ」から「無名ハッシュ」を取得する例です。

use strict;
use Data::Dumper;

my %c   = ('x'=>'えっくす', 'y'=>'わい', 'z'=>'ぜっと'); # ハッシュ
my $ref = {%c};  # 無名ハッシュを作り出す {  }

print Dumper $ref;

結果:

$VAR1 = {
          'y' => 'わい',
          'x' => 'えっくす',
          'z' => 'ぜっと'
        };

しかし、この、「ハッシュ」から「無名ハッシュ」を作る方法は、実践ではほとんど使われません。
実践でよく見かけるのは、つぎの、
「配列」から「無名ハッシュ」を作り出す方法です。

use strict;
use Data::Dumper;

my @c   = ('x', 'えっくす', 'y', 'わい', 'z', 'ぜっと'); # 配列
my $ref = {@c};  # 無名ハッシュを作り出す {  }

print Dumper $ref;

結果:

$VAR1 = {
          'y' => 'わい',
          'x' => 'えっくす',
          'z' => 'ぜっと'
        };


ということで、


「配列」を「ハッシュ」にしたり、 %c = @d
「配列」から「無名配列」を作り出してみたり、 $ref = [@c]
「ハッシュ」から「無名ハッシュ」を作り出してみたり、 $ref = {%c}
「配列」から「無名ハッシュ」を作りだしたり、 $ref = {@c}


といったことを、見てきました〜

「配列」から「無名ハッシュ」は、よく見かけるので できるようにしておきましょう。


それでは また〜