68user's page 掲示板

Prev< No. 103> Next  [最新発言に戻る] [過去ログ一覧]
No. 103 # mm 1999/01/30 (土) 02:43
ちょっと横ヤリです(^o^;ゞ
local も my も、その宣言位置から、これを囲む最も内側のブロックの最後までが有
効範囲であるという点は同じです。ただし、この「ブロックの最後まで」というのが、
localの場合が時系列的に判断されるのに対して、my はスクリプトの見た目上のブロッ
クの階層構造で判断されます。
つまり、my は、C言語などと同じで、ブロックの異なる階層に同じ名前の変数が my
で宣言されている場合、その変数が現れた位置の最も内側のブロックで宣言されたも
のが参照されます(ブロックスコープ)。
これに対して、local は、LISPなどと同じで(これはちょっと?)、系列や階層が異
なるブロックに同じ名前の変数が local で宣言されている場合、プログラムの実行に
伴って、この実行のステップがどのブロック内にあるか(また、どのブロック内から
呼び出されたか)ということによって有効範囲が判断され、既に有効範囲を外れたも
のを除いて、現在有効である最も最近宣言されたものが参照されます(動的スコープ)。

なお、自分自身を呼ぶだけの単純な再帰呼び出しでは、myもlocalも変わりないと思い
ます(たぶん)。
ただ、perl4の解説では、localをループ内で使うと、ループのたびにスタックが消費
されると書いてあったのですが、perl5ではこの説明がなくなってました。なんでかな
ぁ…?

a=b+c などは、一般のプログラム言語では文(代入文)となりますが、Cやperlなどで
は単なる式となります( = は b+c の値を返すだけの演算子で、副作用としてこの値
を a に代入します)。で、どちらの場合も = の右側には式が書けるので、Cやperlな
どの場合にのみ x=(a=b+c) というような記述が可能になります。また、= は右結合の
演算子なので、68userさんの仰るように ( ) が不要になります。

Prev< No. 103> Next  [最新発言に戻る] [過去ログ一覧]