サンプルコードによるPerl入門のコーディングルール




  1. Perl



  2. コーディングルール

 サンプルコードによる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 (条件) {

}
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を書いてきて、こう書けば、一般的で、わかりやすく、美しく、短く書けると感じているものです。よいコーディングのための参考にどうぞ。