« Lingua::JA::Summarize 0.02 | メイン | Lingua::JA::Summarize 0.03, 0.04 »

2006年05月02日

Perl Monger への道は遠い

 Lingua::JA::Summarize のリリースで、弾さんCharsbar さんをはじめ、いろいろな方からアドバイスをいただきました。ありがとうございます。そのうち、 Perl の書法について学んだことを、忘れないうちにまとめておこうと思います。

1) Emacs の設定

cperl-mode.el は 4.32 が良い? CPAN からダウンロードしてきて、 /usr/share/emacs/site_lisp あたりに放り込む。
.emacs は おいぬま日報(不定期)さんのをコピペ。

2) クラスのフィールドの扱い

まず、デフォルト値をハッシュテーブルに定義しておいて、そこからアクセサを生成するのが楽。コンストラクタでは、 { %Fields, %$args } のようにして、デフォルト値と引数を結合。
外部から %Defaults をいじってデフォルト値が変えられるという利点も。

my %Defaults = (     prop_a => 'default_a',     ... ); __PACKAGE__->mk_accessors(keys %Defaults);

sub new {
    ...
    my $self = bless { %Defaults, %$args };
    ...

3) 連想配列によるフラグの初期化

my %NG = map { $_ => 1 } (LIST);

4) || よりも or

Damian 先生によると、組み込み関数では () を使わないほうが読みやすく、また、組み込み関数とユーザー定義関数の区別が明確になるので良い、ということらしい。よって、 open LIST のように書きたいので、演算子の優先順位の関係上、 || ではなく or を使うことになる。(Perl Best Practices, 2.10)

なんで組み込み関数を区別する必要があるのかよくわかんないけど、それはそれで長いものに巻かれるとして、じゃあ、↓のようなケースでは、どちらを使うべきなんだろう? どちらでも良い?

if ($a == 1 || $b == 2) # それとも if ($a == 1 or $b == 2)

5) setuid されている場合、 perl は自動的に tainted mode で動く

いい加減なコードでも安心 (cf. perldoc perlsec)

6) open には -|, |- とかいうモードがある (popen & fork に相当)

open $fh, "-|" or exec(@argv) or croak "failed: $!";

のように使う。perl 5.8.0 からは、

open my $psfh "-|", "ps", "aux" or die $!;

のようにも書くことができる。ただし、win32 では動かない。 (cf. perldoc perlopentut)

7) perl のパーサは、実行環境の文字コードに関係なく動作する

EUC のソースコードを Shift_JIS の環境で動かしても問題ない。 (cf. perldoc utf8)
#エラーメッセージとか I/O の文字コードとか、そういう問題はあるけど


うーん、いろいろありますね。Emacs の cperl-mode にもイルカのカイル君がいて、「ケケケッ」とか注意してくれればいいのに。

投稿者 kazuho : 2006年05月02日 11:38 このエントリーを含むはてなブックマーク このエントリーを含むはてなブックマーク

トラックバック

このエントリーのトラックバックURL:
http://labs.cybozu.co.jp/cgi-bin/mt-admin/mt-tbp.cgi/573