PERLSTYLE(1) USER COMMANDS PERLSTYLE(1) NAME perlstyle - Perl のスタイルガイド DESCRIPTION スタイル もちろん、人それぞれにフォーマットの好みがありますしが、読み やすく、理解しやすく、保守しやすいプログラムにするための一般 的なガイドラインも存在します。 コードレイアウトの美学に関して、唯一 Larry が強く気にかける ことは、複数行に渡る BLOCK の閉じ中括弧の位置を、その構文を 開始するキーワードとカラム位置を揃えるということです。 この 他には、それ程に強くはない好みとして: + 4 カラムのインデント。 + 開き中括弧は、できるだけキーワードと同じ行におくようにす る。さもなくば、キーワードとカラムを揃える。 + 複数行ブロックの中括弧の前は空ける。 + 1 行の BLOCK は中括弧も含めて 1 行にしてよい。 + セミコロンの前には空白を入れない。 + 「短い」1 行の BLOCK では、セミコロンを省く。 + ほとんどの演算子の両側には空白を入れる。 + (大括弧の中の) 「複雑な」添字の両側には空白を入れる。 + 動作内容の異なる、かたまりごとに空行を入れる。 + else は行替えする。 + 関数名と開き括弧の間に空白を入れない。 + コンマのあとには空白を入れる。 + 長い行は ("and" と "or" 以外の) 演算子のあとで改行する。 + その行内でマッチする最後の括弧の後にスペースを入れる。 + 対応する項目は、カラムを揃えて縦に整列する。 + 明瞭さの妨げにならない範囲で、余分な句読点などは省く。 Larry はこれらのことに対して彼なりの理由を持っていますが、他 の人が同じように考えなくても文句をいう筋合いのものではありま せん。 Perl manpages Last change: Release 5.0 Patchlevel 00 1 PERLSTYLE(1) USER COMMANDS PERLSTYLE(1) もう少し本質的なスタイルの問題も考えておくべきでしょう: + 何らかの方法で書けるからといって、その方法でやらなくては ならないことはありません。 Perl は何でもいくつかの方法 でできるように設計されていますので、もっとも読みやすいも のを選ぶとよいでしょう。 たとえば、 open(FOO,$foo) || die "Can't open $foo: $!"; という方が die "Can't open $foo: $!" unless open(FOO,$foo); のように、文の重要なポイントを修飾子に隠してしまうよりも 良いでしょう。 また、 print "Starting analysis\n" if $verbose; の方が $verbose && print "Starting analysis\n"; よりも良いでしょう。使う人が -v と入力したかどうかを判定 するのがポイントではないからです。 同様に、演算子にデフォルトの値が用意されているからといっ て、それを利用しなければならないというものではありません。 デフォルトは、怠け者のシステムプログラマが「一時的な」プ ログラムを書くためにあるのです。 プログラムを読みやすく したいと思うならば、ちゃんと引数を与えるようにしてくださ い。 さらには、多くの場所で括弧を省くことができますが、これは 決して省かなければならないということではありません: return print reverse sort num values %array; return print(reverse(sort num (values(%array)))); 疑わしいときには括弧を付けるべきです。 少なくとも、vi で % キーを使って、跳ねまわることができます。 特に疑わしい場合でなくても、みなさんの後を引き継いでコー ドのメンテをする人のことを考えてあげてください。 間違っ たところに括弧を付けてしまうかも知れません。 Perl manpages Last change: Release 5.0 Patchlevel 00 2 PERLSTYLE(1) USER COMMANDS PERLSTYLE(1) + ループの最初や最後で抜けられるように、妙に莫迦げた細工を しないこと。 Perl では、last 演算子を用意しているので、 ループの途中で抜けることができるのです。 目立つように、 少しばかり突き出して置けばよいのです: LINE: for (;;) { statements; last LINE if $foo; next LINE if /^#/; statements; } + ループラベルを付けるのを恐れてはいけません。 多重のルー プからの脱出するためでもありますが、読みやすくするためで もあるのです。 上の例を参照してください。 + 移植性のため、すべてのマシンでインプリメントされていない 機能を使う場合には、eval の中で使ってみて調べてください。 その機能がインプリメントされているバージョンやパッチレベ ルがわかるのであれば、$] (English モジュールを使っている ときには $PERL_VERSION) を調べて、実装されているかを見る ことができます。 Config モジュールで Perl をインストー ルした時に、Configure プログラムで決定された値を引き出す ことができます。 + 意味のある識別子名を使ってください。 何を意味しているの かがわからなくなれば、きっと問題になるでしょう。 + ごちゃごちゃした正規表現には、/x 修飾子を使って、空白を 入れ、なるべく見やすくするようにしましょう。 正規表現の 中にスラッシュやバックスラッシュを使っている時には、区切 文字にスラッシュを使うのは避けましょう。 + リスト演算子に括弧を付けなければならなくなるのを避け、&& や || といった記号的な演算子の頻度を下げるために "and" や "or" という新しい演算子を使ってください。 過剰な & や括弧を避けるために、サブルーティンは関数やリスト演算子 として使いましょう。 + 何回も print() 文を繰り返すよりは、ヒアドキュメントを使っ てください。 + 対応するものは縦に並べましょう。特に 1 行に収まらないく らい長い場合には。 $IDX = $ST_MTIME; $IDX = $ST_ATIME if $opt_u; $IDX = $ST_CTIME if $opt_c; $IDX = $ST_SIZE if $opt_s; Perl manpages Last change: Release 5.0 Patchlevel 00 3 PERLSTYLE(1) USER COMMANDS PERLSTYLE(1) mkdir $tmpdir, 0700 or die "can't mkdir $tmpdir: $!"; chdir($tmpdir) or die "can't chdir $tmpdir: $!"; mkdir 'tmp', 0777 or die "can't mkdir $tmpdir/tmp: $!"; + 変換を行なうときに並べることでわかりやすくなるならば、並 べましょう。 tr [abc] [xyz]; + 再利用性を考えましょう。 同じようなことをまたしなくては ならないかもしれないときに、一時凌ぎのスクリプトに頭を悩 ませることはないでしょう。 コードを一般化することを考え てください。 モジュールやオブジェクトクラスを書くことを 考えてください。 use strict や -w を有効にして、コード の不明瞭な部分が無いようにしてください。 コードを減らす ことを考えてください。 全体の見方を変えることも考えてく ださい。 さらに ... やめましょう。 + 一貫性をもって。 + 良識をもって。 Perl manpages Last change: Release 5.0 Patchlevel 00 4