perlの多次元配列

perlの二次元配列の作り方がさっぱり - 誰か助けて orz - ir9Ex’s diaryの話題について反応。

ぶっちゃけperlなんてもう5, 6年まともに触ってないのでぜんぜん覚えてないのでもっときれいなやり方とかあったら誰か教えてください。

今回の件がcsvっぽいデータから2次元配列への格納ってことだったのでそれを踏襲して書いてみた。

まずはテストデータ、test.csv

1, 2, 3, 4, 5, 6, 7
21, 22, 23
31, 32, 33, 34, 35

で、コード本体、test.pl

#!/usr/bin/perl

open FILE, "<./test.csv" or die;

@result = ();
while (<FILE>)
{
    @columns = split /,/, $_;

    push (result, \@columns);
}

print $result[0][1] . "\n"; # = 2
print $result[1][2] . "\n"; # = 23
print $result[2][3] . "\n"; # = 34

で、実行結果

$ ./test.pl 
 32
 33
 34

はい、見事に失敗です。
どうも参照は配列自体ではなくてポインタで指し示してるような感じっぽい。
んじゃ配列コピーして参照渡したらどうか?と思ってぐぐってみたら角括弧でアレイのコピーになる - 西尾泰和のはてなダイアリーが見つかりました。

id:uskzさんが書いてた方法はこれを使ってるってことなのね。

ということでtest.pl書き換え。

#!/usr/bin/perl

open FILE, "<./test.csv" or die;

@result = ();
while (<FILE>)
{
    @columns = split /,/, $_;

    push (result, [@columns]);
}

print $result[0][1] . "\n"; # = 2
print $result[1][2] . "\n"; # = 23
print $result[2][3] . "\n"; # = 34

pushするときに角括弧でくくるようにしただけです。
で、実行結果。

$ ./test.pl 
 2
 23

 34

おっとっと、$result[1][2]の要素が改行削ってなかったのでおかしいことになってますが、多次元配列はうまく動いたようです。