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>

From : 跏鞐 @ 2009-04-10 08:24:34

竡髀鈔 銓蔬辮? 髀瑜鱶 蓐閻鞐鴈鞐

竡髀鈔 銓蔬辮? 髀瑜鱶 蓐閻鞐鴈鞐

From : 竡髀鈔 銓蔬辮? 髀瑜鱶 蓐閻鞐鴈鞐 @ 2009-04-12 19:49:31

關珥蓚 鉐珮 蒟跂辣辷?跏

關珥蓚 鉐珮 蒟跂辣辷?跏

From : 關珥蓚 鉐珮 蒟跂辣辷?跏 @ 2009-08-08 03:35:12

跏辣 袱

跏辣 袱

From : 跏辣 袱 @ 2009-08-20 07:15:52

髓鞐?矗辷 珥鴈跪瘉? 鼕鞐蓁

髓鞐?矗辷 珥鴈跪瘉? 鼕鞐蓁?/a>

From : 髓鞐?矗辷 珥鴈跪瘉? 鼕鞐蓁 @ 2009-09-10 06:24:02

鉐珮 騾迥 閻鱚鞜齔

鉐珮 騾迥 閻鱚鞜齔

From : 鉐珮 騾迥 閻鱚鞜齔 @ 2009-10-10 11:39:49

Track from Your Website

http://coji.s9.xrea.com/trackback/tb.php?id=68

Comment

No Comments

Post Your Comment


*は入力必須です。E-Mailは公開されません。