Perlでは配列の中に配列への参照を入れることができるので、これを使うと多次元配列が実現できる。
ソース
# 多次元配列
use strict;
use warnings;
use utf8;
my @Array = ();
$Array[0][0] = "a";
$Array[0][2] = "b";
$Array[1][1] = "c";
$Array[2][0] = "d";
$Array[2][3] = "e";
printAll1( \@Array );
printAll2( \@Array );
# @Array の内容を全置き換え。以前の内容は失われる
@Array = (
[ undef, "a", undef, "b", ],
[ "c", ],
[ "d", undef, "e", ],
);
printAll1( \@Array );
printAll2( \@Array );
exit();
# 一定範囲を出力
sub printAll1
{
my( $refArray ) = @_;
for( my $i=0; $i<3; ++$i ){
printf( "%d /", $i );
for( my $j=0; $j<4; ++$j ){
printf( "\t%d:'%s'", $j, ($refArray->[$i][$j] || '') );
}
printf( "\n" );
}
printf( "\n" );
}
# 0から最大の添え字までを出力
sub printAll2
{
my( $refArray ) = @_;
for( my $i=0; $i<scalar(@{$refArray}); ++$i ){
printf( "%d /", $i );
for( my $j=0; $j<scalar(@{$refArray->[$i]}); ++$j ){
printf( "\t%d:'%s'", $j, ($refArray->[$i][$j] || '') );
}
printf( "\n" );
}
printf( "\n" );
}
# EOF
出力結果
0 / 0:'a' 1:'' 2:'b' 3:''
1 / 0:'' 1:'c' 2:'' 3:''
2 / 0:'d' 1:'' 2:'' 3:'e'
0 / 0:'a' 1:'' 2:'b'
1 / 0:'' 1:'c'
2 / 0:'d' 1:'' 2:'' 3:'e'
0 / 0:'' 1:'a' 2:'' 3:'b'
1 / 0:'c' 1:'' 2:'' 3:''
2 / 0:'d' 1:'' 2:'e' 3:''
0 / 0:'' 1:'a' 2:'' 3:'b'
1 / 0:'c'
2 / 0:'d' 1:'' 2:'e'
ソース
# 多次元ハッシュ
use strict;
use warnings;
use utf8;
my %Hash = ();
$Hash{'A'}{'a'} = "1";
$Hash{'A'}{'b'} = "2";
$Hash{'B'}{'a'} = "3";
$Hash{'B'}{'b'} = "4";
$Hash{'B'}{'c'} = "5";
$Hash{'C'}{'b'} = "6";
$Hash{'C'}{'c'} = "7";
printAll1( \%Hash );
printAll2( \%Hash );
# %Hash の内容を全置き換え。以前の内容は失われる
%Hash = (
'A' => { 'b'=>"11", },
'B' => { 'a'=>"12", 'b'=>"13", 'c'=>"14", },
);
printAll1( \%Hash );
printAll2( \%Hash );
# %{$Hash{'B'}} の内容を置き換え
$Hash{'B'} = { 'b'=>"15", };
# %{$Hash{'C'}} の内容を追加
$Hash{'C'} = { 'a'=>"16", 'c'=>"17", };
printAll1( \%Hash );
printAll2( \%Hash );
exit();
# 一定範囲を出力
sub printAll1
{
my( $refHash ) = @_;
my @Xs = qw( A B C );
my @Ys = qw( a b c );
foreach my $x ( @Xs ){
printf( "%s /", $x );
foreach my $y ( @Ys ){
printf( "\t%s:'%s'", $y, ($refHash->{$x}{$y} || '') );
}
printf( "\n" );
}
printf( "\n" );
}
# 存在する要素を出力
sub printAll2
{
my( $refHash ) = @_;
foreach my $x ( sort( keys( %{$refHash} ) ) ){
printf( "%s /", $x );
foreach my $y ( sort( keys( %{$refHash->{$x}} ) ) ){
printf( "\t%s:'%d'", $y, ($refHash->{$x}{$y} || '') );
}
printf( "\n" );
}
printf( "\n" );
}
# EOF
出力結果
A / a:'1' b:'2' c:''
B / a:'3' b:'4' c:'5'
C / a:'' b:'6' c:'7'
A / a:'1' b:'2'
B / a:'3' b:'4' c:'5'
C / b:'6' c:'7'
A / a:'' b:'11' c:''
B / a:'12' b:'13' c:'14'
C / a:'' b:'' c:''
A / b:'11'
B / a:'12' b:'13' c:'14'
C /
A / a:'' b:'11' c:''
B / a:'' b:'15' c:''
C / a:'16' b:'' c:'17'
A / b:'11'
B / b:'15'
C / a:'16' c:'17'