Namazu のコーディング規則 - Perl編 mknmz固有の事情 * debugメッセージを出力するときは必ず util::dprint() を使う * verboseメッセージを出力するときは必ず util::vprint() を使う * エラーなどの理由で die するときは必ず util::cdie() を使う * ファイルを開くときには必ず util::efopen() (エラーの時に util::cdie() する)または util::fopen() を使う * while (<>) {} や while (<$fh>) {} を禁止する。$_ はグロー バル変数であるため、危険。代わりに while (defined(my $line = <$fh>)) {} とする。 * 一時ファイルを作るときは必ず my $tmpfile = util::tmpnam("NMZ.foobar"); として一時ファイルの名前を取得する。 * ファイルの中身をまるごと読み込むときは util::readfile() を使う。 join '' <$fh> より速いはず。 * ファイルを rename するときは必ず util::Rename() を使う。 OS/2 対策。 * プログラム全体に影響をおよぼすグローバル変数は lib/var.pl.in に定義する。 * mknmz 内だけに影響をおよぼすグローバル変数は src/mknmz.pl.in に定義する。 $SYSTEM のみ例外。 * ユーザが mknmz.conf, ~/.mknmzrc にて変更したいであろう変 数は lib/conf.pl.in に定義する。 書法 * 必ず -w オプションを用いる #! /usr/bin/perl -w * 必ず use strict する * local() は使わない * 変数は使う位置で宣言する - C言語のようにブロックの最初で宣言する必要はない * 変数の宣言時にはできる限り初期化を行う * for は for my $tmp (@foo) { ... } のように用いる - my $tmp の部分が要 ($tmpのスコープをループ内に限定する) * 戻り値は陽に return する - サブルーチン最後の式が return される、というルールに頼らない * built-in関数呼び出しの際は省略できる丸括弧はできるだけ省く - ○ substr $str, $offset, $len; × substr($str, $offset, $len) * 正規表現では $&, $', $` を使わない - プログラム全体が遅くなるため * サブルーチンの呼び出しは foobar() とする - &foobar は不可 ("&" は不要) * サブルーチンの定義ではプロトタイプ宣言を行う - sub foobar($$$) { ... } のように * $_ はできる限り使わない - $_ はグローバル変数なので危険 * open() は使わない。 use IO::File を用いて my $fh = new IO::File; $fh->open() とする * ファイルは陽に閉じず、 destructor にまかせる - $fh->close() しない (スコープで制限する) * リファレンスは大いに活用する * 既存の perl module を活用する - 車輪の再発明をしない * $| といった特殊変数はできるだけ用いない - $| は STDOUT->autoflush(1) で代用できる * グローバル変数はできるだけ使わない * コードはできる限りモジュール化する - APIを定めて拡張を容易にする * 必要に応じて Object Oriented Programming を取り入れる - すべてを OOP で書くことはない * 長い正規表現には適宜 /x モディファイアを適用する * 変数を使った正規表現には安全なら /o モディファイアを適用 する * コメントは英語で書く 名前規則 * テンポラリな変数は型を問わず tmp という名前にする * for 文のカウンタには $i, $j, $k を用いる - 3段より深くしないように気をつける * サブルーチン名は動詞 (+目的語)、変数名は名詞 - e.g. update_registry() * 語の連結にはアンダースコア ('_') を用いる - e.g. get_os_name(), $os_name * 局所変数の名前は小文字 * グローバル変数の名前は capitalize し、アンダースコアを省 略する (要検討) - $IndexType * 配列、ハッシュの変数名は複数形にする (要検討) - @files * 変数名の極端な省略はしない - $on (OS name) などは不可 * が、必要に応じて省略する (要検討) * 省略のルールは明確化する - file handle -> fh - pointer -> ptr - index -> idx - current -> cur - protocol -> proto - length -> len - string -> str - argument -> arg - source -> src - destination -> dest - control -> ctrl - module -> mod - language -> lang - initialize -> init - variable -> var - 他にもあれば追加する * package が異なれば同じサブルーチン名を用いて良い インデント * インデントは 4文字単位 $foo = 1 + 2 + 3; $bar = ((1 + 2) + 3) * 4; if ($foo == $bar) { print foobar($foo, $bar), "\n"; } else { die "error"; } sub foobar ($$) { my ($foo, $bar) = @_; return $foo + $bar; } Perl関連リンク * CPAN * Perl Style * perl5.005_02のドキュメント * perl5.004_04のドキュメント * Perl information memo * /pub/IIJ/dist/utashiro/perl directory * /pub/lang/CPAN/authors/Hirofumi_Watanabe directory * FMTEYEWTK * Yahoo! - Computers and Internet:Programming Languages:Perl * JPerl for Win32 * Index of /archives/lang/perl/CPAN/modules/by-authors/Gurusamy_Sarathy * Learning Perl/Tk * ActiveState Tool Corp. - Professional tools for Perl developers * Index of /archives/lang/perl/CPAN/modules/by-module/Tk * What's wrong with Perl