2008-05-10
リストと配列 その1
Perl学習の続き。今日は「はじめてのPerl」第3章、「リストと配列」の前半をやりました。
- 3.1 配列の要素にアクセスする
- 3.2 配列の特別なインデクス
- 3.3 リストリテラル
- 3.3.1 qw ショートカット
- 3.4 リスト代入
- 3.4.1 pop演算子とpush演算子
- 3.4.2 shift演算子とunshift演算子
- 3.5 配列を文字列の中に展開する
- 3.6 foreach 制御構造
- 3.7 Perl お気に入りのデフォルト: $_
- 3.7.1 reverse演算子
- 3.7.2 sort演算子
ひっかかったこと
- push/pop と unshift/shift の違い
- foreach で受ける変数は要素そのもので(参照?)、代入すると配列の要素自体が変更される
- デフォルト変数 $_ はどこでいじられてるのか。内部表現
というわけで、とりあえず配列の内部表現を見てみようとまた Perl 1.0 のソースを見ます。
今回は簡単で、 array.h と array.c にまとまっているようです。
array.h (コメントは溝口)
atbl は perl.h で typedef struct atbl ARRAY; と定義されています。
では配列の作成をしてるらしい anew を見ます。
array.c:69
要素のバッファを多少余分にとって確保してることがわかります。ary_max を見ると4個分?1個は末尾マーカーかな?
safemalloc は util.c で定義されてて、引数チェックと、メモリが確保できなかったときの異常終了をしています。bzero は perl.h で #define bzero(s,l) memset(s,0,l); されてます。
配列からの取得は afetch
array.c:16
key が取得したい要素のインデックス番号。ここでみると数値を期待してますね。範囲外の要素は undef (Nullstr) を返すようです。
次、要素をいれるっぽい astore
array.c:26
オーソドックス。
配列の要素数以上のkeyにstoreされると、要素の枠を追加で確保して、要素数(ary_fill)、最大インデックス(ary_max)を更新した上で、上書きされる要素をstr_freeし、最後に上書きする。上書きがあった場合は1を返すようです。
要素枠の追加時は、既存の最大要素数の5分の1だけバッファを用意して、連続追加でもパフォーマンスが落ちないようにしてるみたいですね。
さて、ここまではわかりましたが、eval のなかからここまでどうやって呼ばれるんでしょう。あと配列の作成、解放のタイミングも気になります。
それらは奥が深そうなので、いったん気になるまま置いておいて、明日は pop / shift の違いと foreach, デフォルト変数周り、あとざっと reverse, sort も実装を見ようと思います。
6 Trackbacks
跏鞐
跏鞐?/a>
竡髀鈔 銓蔬辮? 髀瑜鱶 蓐閻鞐鴈鞐
竡髀鈔 銓蔬辮? 髀瑜鱶 蓐閻鞐鴈鞐
關珥蓚 鉐珮 蒟跂辣辷?跏
關珥蓚 鉐珮 蒟跂辣辷?跏
跏辣 袱
跏辣 袱
髓鞐?矗辷 珥鴈跪瘉? 鼕鞐蓁
髓鞐?矗辷 珥鴈跪瘉? 鼕鞐蓁?/a>
鉐珮 騾迥 閻鱚鞜齔
鉐珮 騾迥 閻鱚鞜齔
Track from Your Website
http://coji.s9.xrea.com/trackback/tb.php?id=68


Comment
No Comments