電子書籍の厳選無料作品が豊富!

perlで三次元配列をテキスト入力から作りたいのですが、例えば二次元配列の場合
foreach $line (@input)
push @data, [split /[:]/, $line];
で@dataが二次元配列になるのですが、三次元配列の場合このあとに
push @output, \@data;
とするとリファレンスが同じであるためループをまわしてもうまく三次元になりませんよね。
解決法はありますでしょうか?

A 回答 (2件)

いわゆるdeep copyをしたいわけでしょうか?


Storableモジュールのdclone関数を使えばdeep copyしてくれると思います。

use Data::Dumper;
use Storable qw(dclone);

my (@data, @output);
my @input = qw(1:2 a:b);

foreach $line (@input) {
push @data, [split /:/, $line];
push @output, dclone(\@data);
}

print Dumper \@output;
    • good
    • 0

そもそも Perl だと


foreach $line (@input)
push @data, [split /[:]/, $line];
とは書けない.

本題は「リファレンスが同じになることが問題」であるなら「必ずリファレンスが違うようにすればいい」ということになる. 適切に my するのが最も簡単か.

あと,
push @data, [split /[:]/, $line];
には違和感がある.
push @data, [split /:/, $line];
で十分では?
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!