- Perl ›
- コーディングルール
Perlゼミのコーディングルール
Perlゼミは、以下のコーディングルールに従って作成されています。参考にどうぞ。
スタイル
インデントはスペースで2
sub parse { my $str = shift; my $tree; ... return $tree; }
1行は79文字以内
1行は79文字以内で書いています。
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
スペース
括弧 () の内側にスペースを入れない
my @nums = (2, 4, 5); my %ages = (kimoto => 20, ken => 25); my $total = (2 + 3) + 2; while ($num == 2) { ... } for (my $i = 4; $i < 5; $i++) { ... }
ブラケット [] の内側にスペースを入れない
my $nums = [2, 4, 5];
ハッシュのリファレンスのブレース {} の内側にスペースを入れない
my $ages = {kimoto => 20, ken => 25};
サブルーチンが1行のときはブレースの内側にスペースをひとつ入れる
sub ua { LWP::UserAgent->new }
文が1行のときはブレースの内側にスペースをひとつ入れる
if (条件) { $num = 1 } else { $num = 2 }
カンマの手前はスペースを入れず、カンマの後ろにスペースを入れる
my @nums = (2, 4, 5);
演算子の左右にはスペースを入れる
2 + 3 2 - 3 2 * 3 2 / 3 2 ^ 5 2 == 3 2 != 3 2 < 3 2 > 3 'a' . 'b' 'a' eq 'b' 'a' ne 'b'
if文, unless文, while文, for文の直後にはスペースを入れる
if文, unless文, while文, for文の直後にはスペースを入れます。
if (条件) { } unless (条件) { } for (条件) { } while (条件) { }
if, unless, while, forの開きブレース { の手前にはスペースを入れる
if (条件) { } unless (条件) { } for (条件) { } while (条件) { }
スペースはいつもひとつ分
my $num = 1; my $title = 'Perl'; my $author = 'kimoto';
イコール(=)をそろえるときれいに見えますが、修正の手間を考えるとめんどうなので、スペースはいつもひとつ分にしています。
複数行になるときは+2のインデントにする
my $str = 'Hello Hello Hello Hello Hello Hello Hello Hello Hello ' . 'Hello Hello Hello Hello Hello Hello Hello Hello Hello ' . "Hello Hello Hello Hello Hello \n";
文字列の位置でそろえると見やすいですが、空白の修正が手間がかかるので、空白で+2の位置に次の行をつなげるようにしています。
セミコロン
サブルーチンが1行のときはセミコロン ; をつけない
sub ua { LWP::UserAgent->new }
文が1行のときはセミコロン ; をつけない
if (条件) { $num = 1 } else { $num = 2 }
文字列
文字列に変数を含まないときはシングルクォートを使う
my $str = 'Hello World!';
条件文・繰り返し文
untilを使わずにwhileを使う
while (条件) { }
whileですべての条件文が書けて、他の言語でも一般的ですのでuntilは使わないで、whileを使っています。
do ~ whileは使わずにwhileを使う
while (条件) { }
do ~ whileで書ける文はすべてwhileで書けて、doの中ではnextやlastが使えないという制約があるので、whileを使っています。
foreachを使わずforを使う
for (条件) { ... }
foreachはforの別名なので、短く書けるforを使っています。
モジュール・サブルーチン・メソッド
引数がひとつの関数には括弧をつけない
my $num = int 5; my $class = ref $obj;
引数が不要な関数やメソッドには括弧をつけない
my $time = time; my $ua = LWP::UserAgent->new;
直接オブジェクト構文を使う
my $ua = LWP::UserAgent->new;
間接オブジェクト構文は使っていません。
例外。
print $fh "Hello"; printf $fh "Hello%d", 3;
非常に一般的な書き方になっているため。
インポートする関数は明示する
use Encode 'encode';
例外。インポートの記述を行わないことが非常に一般的な場合。
use Mojolicious::Lite; use Time::Piece;
インポートする関数がひとつのときはシングルクォートで囲う
use Encode 'encode';
インポートする関数が複数のときは文字列リスト演算子qw//を利用する
use Encode qw/encode decode/;
モジュールの読み込みにはいつもuseを使う
use LWP::UserAgent; use XML::Simple;
例外。実行時にモジュールを読み込みたい場合はrequireを使う。
if ($use_agent) { require LWP::UserAgent; }
けれども、ほとんどの場合はuseで十分に高速ですのでuseを使っています。
関数をインポートしたくない場合は「use モジュール名 ()」を使う
use Carp ();
コメント
コメントのフォーマットは#を一つ書いて、その後ろにひとつのスペースが続いて、その後ろにコメント
# コメント
コメントの先頭は、行の先頭か、複数のスペースだけ
# コメント # コメント
式よりもコメントを先に書く
# 時間 my $time = time;
配列・ハッシュ
配列の要素が1行に収まるときは1行で書く
my @animals = ('cat', 'dog', 'mouse');
配列の要素が1行に収まらないときは、各要素を1行ずつに書く
my @animals = ( 'cat', 'dog', 'mouse', ... );
ハッシュの要素が1行に収まるときは1行で書く
my %ages= (kimoto => 32, ken => 25, asuka => 50);
ハッシュの要素が1行に収まらないときは、各要素を1行ずつに書く
my %ages= ( kimoto => 32, ken => 25, asuka => 50, ... );
コーディングルールの参考にどうぞ
これはPerlゼミのコーディングルールです。僕がPerlを書いてきて、こう書けば、一般的で、わかりやすく、美しく、短く書けると感じているものです。よいコーディングのための参考にどうぞ。