Perl入門ゼミ

テキスト処理、Linuxサーバー管理、Web開発ならPerl
  1. Perl
  2. コーディングルール

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

Giblog