2019年5月8日水曜日

[Perl] 02. 条件分岐とループ

条件分岐とループについてのメモ。色々な言語に手を出せば出すほど書き方が分からなくなる。きっと"あるある"だと思う。



比較演算子
条件分岐やループの前に、まずは比較演算子についてメモしておく。数値と文字列で比較演算子が違うので注意。bash に似ている。

数値 文字列 説明
> gt 左側が右側より大きい
>= ge 左側が右側より大きい or 等しい
< lt 左側が右側より小さい
<= le 左側が右側より小さい or 等しい
== eq 等しい
!= ne 等しくない
>=< cmp 比較 (左側が大:1, 等しい:0, 右側が大:-1 を返す)

関係演算子
複数の条件式を組み合わせたいときに使います。

論理積 and または &&
論理和 or または ll
排他的論理和 xor
否定 not または !

条件分岐
■ if 文
case 文(switch 文)っぽい記述を調べたところ given-when 文というのがあるらしいが、if-else 文の方が高速らしいので見なかったとこにする。
また、if は条件を満たした場合に処理が行われるが、if の代わりに unless を使うと条件が満たされれなかった場合に処理が行われる。(個人的には if 文で ! を使って否定する方が見やすい。)
if (<条件式1>) {
  処理1;
} elsif (<条件式2>) {
  処理2;
} else {
  処理3;
}

1行で書くには
処理 if (<条件式>);

if文の代わりに三項演算子も使えます。(Verilog ですごく馴染みのある記述...)
$result = (<条件式>) ? <真のときに代入する値> :  <偽のときに代入する値>;

ループ
■ while 文

ファイルを1行毎に処理したい場合によく使う。
do-while 文もあるが、next や last が使えないという謎仕様らしいので未記載。
while を until にすると条件が偽の間ループとなるらしい。
# i >= 10 になったら抜ける
while (my $i < 10) {
    ...
    $i++;
}

# ファイルを1行毎に処理
open (FH, "< $file_path");
while (my $line = <FH>) {
    ...
}

■ for 文
for (my $i = 0; $i < 10; $i++) {
    ...
}

■ foreach 文

配列を処理したいときによく使う。
foreach my $i (0..9) {
    ...
}

# 配列処理
foreach my $j (@array) {
    ...
}

■ ループを飛ばす/抜ける

次のループに飛ばす場合は next を使用。下記の例では i = 5 の場合のみ以降の処理が飛ばされ、i = 6 の処理が走る。
foreach my $i (0..9) {
    next if ($i == 5);
    ...
}

ループから抜ける場合は last を使用。下記の例では i = 5 を検出したら抜ける。
foreach my $i (0..9) {
    last if ($i == 5);
    ...
}

多重ループから抜けたい場合は last <ラベル名> を使用。
LABEL: foreach my $i (1..10) {
    foreach my $j (1..10) {
        last LABEL if ($j == 5);
        ...
    }
}

ループ処理を最初からやり直す redo 演算子があるらしいが、使ったことない。無限ループにならないように注意。


0 件のコメント:

コメントを投稿