Akihiro's Programmer Blog

Technology Notes for Personal

「初めてのPerl」 第十章

第十章から。

(注意)以下のテクニックは多用厳禁です。コードを読み解く際の参考にするのが良いです。

第十章 さまざまな制御構造

内容

用語集

用語 説明
式修飾子 式の後ろに、式を制御する修飾子を置く。
ポストインクリメント $n++;
ポストデクリメント $n--;
プリインクリメント ++$n;
プリデクリメント --$n;
部分評価演算子 &&,||等、ある場合には式を評価しないことがある演算子

Point

if文やwhile文の条件を反転させたい
# unless制御構造はif文の反対
# 下記のブロック内はif文なら実行されるが。。。
unless (1) {
    # 実行されません
}

# さらにwhile文の反対はuntil制御構造
# 普通なら無限ループが起こるが。。。
until (1) {
    # 実行されません
}
簡単なif文やwhile文を1行で書きたい
# $nが0より大きければ、'hoge'が出力される
print 'hoge' if $n > 0;

# $nが10より小さい間、2が足され続ける
$n += 2 while $n < 10;
スコープの範囲を設定したい
# 裸の括弧内のみにスコープを持つ
{
    my $hoge = 'hogehoge';
}

# エラーになってしまう
print $hoge;
オートインクリメント(デクリメント)のタイミング
# オートインクリメントやデクリメントは、
# 対象の変数の前後によって計算のタイミングが若干違う
my $n = 0;

$m = $n++;    # $mに0が代入されてから$nに1が足される
$m = $n--;    # $mに1が代入されてから$nから1が引かれる

$m = ++$n;    # $nに1が足されてから$mに1が代入される
$m = --$n;    # $nから1が引かれてから$mに0が代入される
ループを制御したい(途中で抜け出したり)
# last演算子でループを抜け出す
for (1..10) {
    if ($_ == 5) {
        last;        # 5回目のループでループ処理を終える
    }
}

# next演算子で現在のループ処理をスキップする
for (1..10) {
    if ($_ == 5) {
        next;        # 5回目のループの処理を飛ばす
    }
}

# redo演算子で現在のループ処理をやり直す
for (1..10) {
    if ($_ == 5) {
        redo;        # 5回目のループが繰り返されて終わらない
    }
}
2重ループの外側のループを制御したい
# ブロックにはラベルを使うことが出来、それを利用する
HOGE: for (1..10) {
    for (1..10) {
        if ($_ == 5) {
            last HOGE;
        }
    }
}
if-elseを1行に纏めたい
# 三項演算子(?:)を使えば実現出来る
$n == 0 ? print 'hoge' : print 'fuga';

# $nが0なら'hoge'、0以外なら'fuga'を出力する
変数がundefの場合にデフォルト値を代入したい
# defined-or演算子(//)を使えば実現出来る
my $hoge = $fuga // 'piyo';

# $fugaがundefの場合、$hogeに'piyo'が代入され、
# $fugaがundefではない場合、$hogeに$fugaの値が代入される
部分評価演算子で制御構造が実現出来る
# 部分評価演算子(&&,||,//,?:)で制御構造を実現することが出来る

# 左側が偽の場合、右側は実行されない
($m < $n) && ($m = $n);

# 左側が真の場合、右側は実行されない
($m > $n) || ($m = $n);
次回は

次回は第十一章を予定。