41349

[code]

    .#.#....
    .#.#....
    ........
    .....#.#
    .......#
    ......#.
    ........
    .......#
    ........
    ........
    
[/code]

このような10行＊8列計80個セルの入力データ（仮にsample.txt）があります。  
perlでこのsample.txtからデータを読み込んで、一行一列ずつ二次元配列に代入したいです。

つまり＠hairetu[i][j]の形で任意位置の要素を抽出することができるようにしたいです。  
例：  
@hairetu[1][1]は"#"が表示  
@hairetu[3][2]は"."が表示

自分のコードは一行目は1つの要素として認識されてしまったので、うまくいかなかったです。  
コードは以下となります。どういう風に書けばいいのか、プロな方教えて頂ければ幸いです。

[code]

    #!/usr/bin/perl
    
    my @hairetu;
    my $i = 0;
    
    my $file = 'sample.txt';
    open (IN, $file) or die "$!";
    
    while (my $ = <IN>) {
       chomp($data);
       $hairetu[$i] = $data;
       $i = $i + 1
    }
    
    $length = @hairetu;
    # print $length;
    for( $i=0 ; $i<@hairetu ; ++$i )
    {
       print $hairetu[$i] . "\n";
    }
    
[/code]


CC BY-SA 3.0
2018-01-31T08:05:51.483
41347
2018-01-31T09:42:19.457
2018-01-31T08:13:38.393
19110
20329
question
perl array
perlで二次元配列の書き方について


`while =
<IN>`で読みとった行を`split`で分割(今回の場合は1文字ずつ)しながら"配列の配列"、の行に対して代入していけばよいかと思います。

[code]

    #!/usr/bin/perl
    
    my $file = "sample.txt";
    my @AoA  = (); # 配列の配列(Array of Array)
    my $i    = 0;
    
    open(FH,"<$file") or die;
    
    while( my $line = <FH> ) {
        chomp($line);
    
        # 読み取った行($line)の内容を
        # split(//,$line)で一文字ずつに分割し
        # "配列の配列"の$i行目に"配列"として代入
        $AoA[$i] = [ split(//,$line) ];
    
        $i++;
    }
    
    print "1x1: $AoA[1][1]\n";
    print "3x2: $AoA[3][2]\n";
    
[/code]


CC BY-SA 3.0
2018-01-31T08:38:45.243
41349
2018-01-31T08:38:45.243
3060
41347
answer


別解として push を使う方法など。

[code]

    #!/usr/bin/perl
    
    ##use Data::Dumper;
    my @hairetu;
    my $file = 'sample.txt';
    
    open(my $fh, '<', $file) or die "$file: $!";
    while (<$fh>) {
      chomp;
      push @hairetu, [split//];
    }
    
    print $hairetu[1][1], "\n";
    print $hairetu[3][2], "\n";
    ##print Dumper(@hairetu),
    
[/code]


CC BY-SA 3.0
2018-01-31T09:42:19.457
41350
2018-01-31T09:42:19.457
41347
answer