今日のラクダ 9章 データ構造

昨日まとめきれなかったものをまとめておく。

9章

9.1.5 よくある誤り p.318
$AoA[$i] = [@array] # 最も安全、場合によっては最も早い
$AoA[$i] = \@array; # 速いが,リスキーである(配列がmy宣言されていなければならない)
@{$AoA[$i] = @array; # ちょっとトリッキーである

一番上の場合は,新しいリファレンスを作成し,@arrayの内容はコピーされるので安全ということだろうか。真ん中のやつがリスキーであるというのは,こういうことだろう。

pirl @> @ary = (1, 2, 3, 4, 5)
(1, 2, 3, 4, 5)

pirl @> $hoge = \@ary
[1, 2, 3, 4, 5]

pirl @> $ary[2] = $ary[3] = 100
100

pirl @> $hoge
[1, 2, 100, 100, 5]

もちろん無名配列リファレンスを使った場合はこのようなことにはならない。

pirl @> @ary = (1,2,3,4,5)
(1, 2, 3, 4, 5)

pirl @> $hoge = [@ary]
[1, 2, 3, 4, 5]

pirl @> $ary[2] = $ary[3] = 100
100

pirl @> $hoge
[1, 2, 3, 4, 5]

ただし,配列の中身がリファレンスの場合はこのようなことが起こりうる。

pirl @> @ary = ([1,2,3], [2,3,4])
([1, 2, 3], [2, 3, 4])

pirl @> $hoge = [@ary]
[[1, 2, 3], [2, 3, 4]]

pirl @> $ary[0][1] = 3
3

pirl @> @ary
([1, 3, 3], [2, 3, 4])

pirl @> $hoge
[[1, 3, 3], [2, 3, 4]]
9.6.1 より複雑なレコードを作成/アクセス/表示をする

FileHandleモジュールを使っている場合には、ハンドルを普通のオブジェクトとして扱うことができる。

間接オブジェクトと普通のオブジェクトの違いがいまいち分かっていない。

とりあえずここまで。