Table of Contents
概要
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'