perl/リファレンスとデリファレンス〜配列の中にハッシュ、ハッシュの中に配列〜

最近、リファレンスとデリファレンスでいろいろするのにはまってます。実験が一通り済んだら、リファレンスとデリファレンスについて改めてまとめます。いろいろいじって実験するの、やっぱり楽しい。。。

#! usr/bin/perl

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

# ◎値に配列を持つハッシュ(配列のハッシュ
my %hash1=(
    komatsu=>[25,'f','Okayama',19821227],
    kogematsu=>[22,'m','Akita',19850625],
    hagematsu=>[36,'m','Okinawa',19530429],
    mogematsu=>[66,'f','Hokkaido',19570807]
);

print Dumper \%hash1;
print "\n";

# 配列をもう一つ追加してみましょう。
$hash1{oomatsu}=[89,'f','America',19320113];
print Dumper \%hash1;

# デリファレンスしてみましょう
print $hash1{hagematsu}[2],"\n";    #出力結果=>Okinawa
print ${$hash1{hagematsu}}[2],"\n"; #上のprint文と等価
print @{$hash1{hagematsu}},"\n";    #出力結果=>36mOkinawa19530429=>「""」で囲んでないから「@」が展開されないため、つながって出力される。
print "@{$hash1{hagematsu}}\n";     #出力結果=>36 m Okinawa 19530429
print "\n";

# ◎要素にハッシュを持つ配列(ハッシュの配列
my @array1=(
    {   
        a=>"hello",
        b=>"good"
    },  
    {   
        c=>"come",
        d=>"distance",
        e=>"energy"
    },  
    {   
        f=>111,
        g=>222,
        h=>333,
        i=>444
    }   
);

print Dumper \@array1;
print "\n";

# 要素を追加してみましょう
push (@array1,{j=>'AA',k=>'BCG'},{l=>'o3ej',m=>'j2dj'});

print Dumper \@array1;
print "\n";


# デリファレンスしてみましょう
print %{$array1[3]},"\n";         #出力結果=>kBCGjAA=>デリファレンスした値の型は、ハッシュのため「%」を使用する。
print "\n";

print ${$array1[3]}{k},"\n";      #下の一行と等価=>keyが{k}のものをデリファレンスした値は、スカラーのため「$」を使用する。
print $array1[3]->{k},"\n";       #出力結果=>BCG
print "\n";

# 配列すべてをデリファレンスしてみよう。
foreach (@array1){
    print %$_,"\n";
};#配列の要素はリファレンスなので、「%」を$_の前に付けてデリファレンスする。デリファレンスした中身はハッシュのため、「%」。
print "\n";

for my $x (@array1){
    print "{\n";
    for my $y (keys (%{$x})){
        print " $y=>$x->{$y},\n";# 考え方=>${$array1[0]}{a}='hello'というのが成り立つ。今、$array1[0]が$xで、aが$bなので、それぞれ置き換えてみる。
    };
    print "},\n";
};
print "\n";

for my $x (@array1){
    print "{\n";
    for my $y (keys (%{$x})){
        print " $y=>${$x}{$y},\n";  # $y=>$x->{$y}と等価
    };
    print "},\n";
};