小池啓仁 ヒロヒト応援ブログ By はてな

小池啓仁(コイケヒロヒト)の動画など。

小池啓仁 ヒロヒト応援ブログ By はてな

スカラー変数を使った配列の配列

Perlでは、配列変数があるので、2次元配列も普通、配列変数を使います。
たとえば、以下の感じ。

use strict;
use warnings;
print "◆配列変数を使った配列の配列\n";
my @a = ([qw(00 01 02)],
         [qw(10 11 12)],
         [qw(20 21 22)],
         [qw(30 21 32)]);
foreach my $i (0 .. $#a) {
    foreach my $j (0 .. $#{$a[$i]}) {
        print ${$a[$i]}[$j];
        print $a[$i]->[$j]; # 上と同じ
        print $a[$i][$j];   # 上と同じ
        print "\n";
    }
    print "\n";
}

これは、配列変数の要素に無名配列のリファレンスを格納して表現しています。
実は、配列変数でなく、無名配列の要素に別の無名配列のリファレンスを格納して、元の無名配列のリファレンスをスカラー変数に格納しても2次元配列が表現できます。
たとえば、以下の感じ。

use strict;
use warnings;
print "◆スカラー変数を使った配列の配列\n";
my $b = [[qw(00 01 02)],
         [qw(10 11 12)],
         [qw(20 21 22)],
         [qw(30 21 32)]];
foreach my $i (0 .. $#$b) {
    foreach my $j (0 .. $#{$b->[$i]}) {
        print $b->[$i]->[$j];
        print $b->[$i][$j]; # 上と同じ
        print $$b[$i][$j];  # 上と同じ
        print "\n";
    }
    print "\n";
}