概要

Perlでは配列の中に配列への参照を入れることができるので、これを使うと多次元配列が実現できる。

配列

  • ソース
    すべてを展開すべてを収束
      1
      2
      3
      4
      5
      6
      7
      8
      9
     10
     11
     12
     13
     14
     15
     16
     17
     18
     19
     20
     21
     22
     23
     24
     25
     26
     27
     28
     29
     30
     31
     32
     33
     34
     35
     36
     37
     38
     39
     40
     41
     42
     43
     44
     45
     46
     47
     48
     49
     50
     51
     52
     53
     54
     55
     56
     57
    
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
    -
    |
    -
    |
    -
    |
    !
    |
    !
    |
    !
     
     
     
    -
    |
    -
    |
    -
    |
    !
    |
    !
    |
    !
     
     
    
    # 多次元配列
     
    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'

連想配列 (ハッシュ)

  • ソース
    すべてを展開すべてを収束
      1
      2
      3
      4
      5
      6
      7
      8
      9
     10
     11
     12
     13
     14
     15
     16
     17
     18
     19
     20
     21
     22
     23
     24
     25
     26
     27
     28
     29
     30
     31
     32
     33
     34
     35
     36
     37
     38
     39
     40
     41
     42
     43
     44
     45
     46
     47
     48
     49
     50
     51
     52
     53
     54
     55
     56
     57
     58
     59
     60
     61
     62
     63
     64
     65
     66
     67
     68
     69
    
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
    -
    |
    |
    |
    |
    -
    |
    -
    |
    !
    |
    !
    |
    !
     
     
     
    -
    |
    -
    |
    -
    |
    !
    |
    !
    |
    !
     
     
    
    # 多次元ハッシュ
     
    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'

添付ファイル: fileMultiDimensional.zip 876件 [詳細]

リロード   新規 下位ページ作成 編集 凍結 差分 添付 コピー 名前変更   ホーム 一覧 検索 最終更新 バックアップ リンク元   ヘルプ   最終更新のRSS
Last-modified: Wed, 09 Jul 2014 14:32:41 JST (1289d)