perl/「格納」について〜値の格納と変数名の格納〜
「値を変数に格納する」ってよく聞くし、「定義された変数名のついた箱に値をカポッと入れる」、っていうイメージもできる。でも、定義された変数名ってどんな扱いになってるんだろう、ってこれまたずっと気になってた。ま、これも、知らなきゃ知らないで別に困りはしないんだろうけどね。
○確認/「値を変数に格納する」ってどういうこと? 例),$x=123; 123という値をxという名前の箱に入れる ●本題/定義された変数名は、どう扱われているのか。 結論としては、変数自身($x)もどこかに格納しているらしいです。 厳密に言うと、「変数名と関連する定義が値とは別に格納されている」ということだそうです。 格納場所は、名前空間(namespace)。 このnamespaceには、以下の2種類あるそうな。 (1)シンボルテーブル(symbol table) グローバル変数を表すシンボルテーブルエントリを格納するグローバルハッシュ。 (2)レキシカルスコープ(lexical scope) シンボルテーブルには属さず、 プログラム内のコードのブロックに所属する、名前のないスクラッチパッド、だそう。 ようは、こちらには、そのブロックだけから見る(scopeの所以)ことのできる変数が入るらしい。 つまり、「my」で宣言された変数が入る、ということみたい。 このシンボルテーブルとレキシカルスコープは、いくつ存在してもよいとのこと。なぜなら、定義したすべての変数名と関連する定義は、いくつか存在するうちの一つに勝手に格納されるから、だそうです。
ちなみに、lexicalは「テキストに関連する」という所以だそう。