ホーム > 読んだ >

Effective Perl

書誌

tagPerl
authorJoseph N.Hall, Randal L.Schwarts
editor吉川邦夫(訳)
publisherアスキー出版局
year1999
price2,800+tax
isbn7561-3057-7

目次

1感想
2抄録
3正誤表

履歴

editor唯野
2001.9.20読了
2002.5.21公開
2002.11.24修正
2012.1.17タグ追加

Effective シリーズの Perl 版。通常 Perl の本といえばラクダ本やリャマ本の版元であり Perl の作者たる Larry Wall も勤めるオライリーといいたいところだが、この本は別である。書名からも分かるように Scott Meyers の 『Effective C++』 と同様の体裁となっており、多岐にわたる機能を持った Perl の勘所を要領よく解説している。そのため、どちらかというと話題の幅広さに重きを置いた形式になっている。まあ、今なら類書が当のオライリーからも『Perl クックブック』として翻訳されているし、これで飽き足らないならば黒ヒョウ本(『実用 Perl プログラミング』)がある。

大抵、言語の文法だけでは実用レベルのプログラムは記述できない。そこで登場するのが、言語特有の落とし穴を解説し、ポイントに絞って解説する、この手の本となる。(それゆえ、ある程度の素養は必要だが)本書は Perl の場合における、そのための良書としておすすめできる一冊である。

抄録

18

この本は、読者の思考を促すように書かれている。例題の多くは、何か微妙な要素を含んでいる。本当にトリッキーな要素は説明するが、シンプルでありながら必ずしも明白ではない、その他の数多くのことは、わざと説明していない場合が多い。しばらく頭を悩ませるようなことがあっても、びっくりしないでいただきたい。Perl は一風変わった言語であり、いろいろな意味でほかのプログラミング言語とは非常に異なっている。流暢さとスタイルは、練習と反復によってのみ身に付くものであること、そして学習はハードワークだけれど、喜びもあれば実りも大きいということを、忘れないでほしい。

19

Perl での配列(array)とは割り当てられたデータのあるデータ構造であり、名前はある場合もない場合もある。これに対し、リスト(list)とは実行時のスタック上に置かれる一連の値を指す。Perl は配列とリストを交互に変換する。

1項 名前空間について知っておこう

Perl のスカラー、配列、ハッシュ、サブルーチン、フォーマット、ファイルハンドル、ディレクトリハンドルは、それぞれ独立した名前空間を持つ。配列やハッシュの中身を $ で参照するというのは、スカラーの参照ではなく結果がスカラーなのだということ。

2項 要素を使いたいとき、スライスを使わないようにする

Perl では配列要素(スカラー)を取得するには $array[$n] とする。これが @array[$n] の場合はスライスになる。スライスはリストであり左値としても利用できるが、スカラーコンテキストで使うとスライスの最後の値を返すという特徴がある。

そのため、要素がひとつのスライスを右値に使うと配列要素のようにふるまうが、これが左値だと最後の値しか残らない。また、@text[@text] = 'EOF'; というときには [ ] 内の @text がリストコンテキストで評価されることにより、左値は @text の内容(文字列)をインデックス(数値)として扱おうとするスライスになる。それは、ほとんどの場合 0 になるので、この @text は @text[0, 0, 0, ... ] となり、その最初の要素に EOF (結果的に undef)がセットされ、その他は 0 という結果を導く。このため単一要素のスライスは使わないようにする方がよい。

一方、スライスは結果から必要な要素だけを選択する場合や、値の交換、配列のソートなどで使うと便利である。

($uid, $gid) = ($stat($file))[4, 5];  // 要素の選択
@array[$m, $n] = @array[$n, $m];  // 値の交換
@name = @name[  # 配列のソート
    sort {$uid[$a] <=> $uid[$b]} 0..$#name ];
@old{keys %new} = values %new;  // 値の上書き

3項 空リストが欲しいときに undef を代入しない

未初期化の配列は「( )」、即ち空リストであり、これを undef で代入すると「要素数 1 の値として undef を持つリスト」となり意味が変容する。そのため配列のクリアは @array = (); として空リストを代入する。配列を本当に縮小させたい場合も undef では無効なので、$#array に代入するか slice( ) や pop( ) などを使う必要がある。これはハッシュでも同様。

@array = undef;
if(@array)  # これは真になる
{
    ・・・
}

全文を読まれる場合はログインしてください


Up