概要

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'

リンク