Perlでスクリプト作ってて、こんな書き方をしてみた。
@lists= ();
foreach $key ( @datas ){
my %rslt;
…色々処理…
push(@lists,\%rslt);
}
foreachの中で連想配列の%rlstに色々なデータを入れて、最終的に@listsに参照渡しでpushする。そしてまたforeachループの最初に戻り、%rsltをmyで再度変数定義して同じ処理を繰り返す。
ここのポイントとして%rsltを@listsにpushする際、参照渡しを行っているのでmyで再定義しないと@listsに入っているリストが全部同じアドレスを指してしまい意味がありません。
で、そのmyでの再定義の時の動きが気になってます。
どうやらmyで再定義すると、もともと使っていたアドレス領域とは違うアドレス領域を確保してくれるみたい。なので、foreachのループの中で@listsに参照渡しとしてpushしても全部、違うアドレスを指すことになるので、こちらの意図したとおりになる。
ただ、myで再定義する前につかっていた%rsltのアドレス領域ってどうなるのかなぁと。上のプログラムが意図したとおりに動いているので、前のアドレス領域はクリアされているわけではなさそう。でもクリアしてなくても実はfreeされてて再利用OKな状態になっていて、運が悪いと別のデータにそのアドレス領域が使われたりしないのかな?あとはガーベージコレクションが走るときにすぱっと消されるとか。
%rlstから参照されなくなっても@listsがアドレス領域を指しているので、大丈夫なのかもしれないという話もあるかもしれない。
Webでちょろっと調べたけど、イマイチよくわからず。
とりあえず動いているから大丈夫なのかな。。。(いいのか?)
作成日:2008/09/10 02:18:47