Perlの小部屋
Perlのプログラミングや利用方法を基本的を中心に情報提供しています

制御構文

Perlはインタプリタな言語です。ソースコードを直接解釈実行します。C言語などのようにコンパイル後に実行ファイルを作成するのではなく、ソースコードに記述された内容を実行時に順次処理していきます。

Perlの真偽値

真と偽

真 (true) と偽 (false) について値

数値の 0
文字列の "0"
空き文字列 ""
未定義値 undef()
上記以外のもの

条件分岐

if文

Perlで条件分岐を行うにはif文を使用します

構文 if ( 条件A ) { 実行A }
elsif ( 条件B ) { 実行B }
else { 実行C }
内容 もし、「条件A」が真であるならば、「実行A」を実行
もし、「条件A」が偽で、「条件B」が真ならば、「実行B」を実行
もし、「条件A」「条件B」が偽であるならば、「実行C」を実行
# if文
# 数値比較
my $num = 5;
if ($num == 5) {
 print "OK";
}

# 文字列比較
my $token = '東京':
if ($token eq '東京') {
 print "OK";
}

if~else文

if~elsif文を使うと、条件を複数記述することができます。

# if~else文
# elseifとelseの組み合わせ
my $num = 5;
if ($num == 5) {
  print "数値は 5";
}elsif ($num == 7) {
  print "数値は 7";
}elsif ($num == 9) {
  print "数値は 9";
}else {
  print "一致しません";
}

論理演算子

論理演算子を使うことによって複合的な条件や否定を表現することができます。

演算子意味
||論理和
&&論理積
!否定
or|論理和(&&より優先順位が低い)
and論理積&&より優先順位が低い)
not否定(!より優先優位が低い)

$yearが1989以上、かつ、2019以下という条件にするためには && を使います。

# && 論理積(A かつ B)
if ($year >= 1989 && $year <= 2019) {
	print "平成";
}

$ageが「20より小さい、または、60より大きい」という条件にするためには || を使います。

# || 論理和(A または B)
if ($age < 20 || $age > 60) {
  ...
}

変数「$num」が「真ではない」という条件

# ! 否定(Aではない)
if (!$num) {
  ...
}

# unless文 上記if文と全く同じ意味
# $numが真でなければブロックを実行
unless ($num) {
  ...
}

三項演算子

三項演算子を使うと、ifの条件式を短縮して(一行にして)表記できます。

構文 : [条件式] ? [真のとき評価される式] : [偽のとき評価される式]

# 三項演算子
$age = 18;
print $age >= 20 ? "成人" : "未成年";
> 未成年

$num = 330;
$result =
    $num >= 420 ? 'Lサイズ' :
    $num >= 300 ? 'Mサイズ' :
    $num >= 210 ? 'Sサイズ' :
    '不可';
print "ドリンク量は$resultです";
> ドリンク量はMサイズです

繰り返し文 ループ文

ある条件のもとで、処理を繰り返し実行します。

構文名構文内容
while文while ( 条件 ) { 実行 }「条件」が真である間は「実行」する
until文until ( 条件 ) { 実行 }「条件」が偽である間は「実行」する
do {} while文do { 実行 } while ( 条件 )「実行」を1度実行し、条件が真である間は「式」をさらに実行
do {} until文do { 実行 } until ( 条件 )「実行」を1度実行し、条件が偽である間は「式」をさらに実行
for文for ( 初期化 条件式 増減式 ) { 実行 }「条件式」が真であれば「実行」する、次に「増減式」を実行
foreach文foreach 制御変数 ( リスト値 ) { 実行 }「リスト値」の要素を順に「制御変数」にセットし、「実行」する
# while文
my $i = 0;
while ($i <= 2) {
    print "$i \n";
    $i++;
}
>  0
>  1
>  2

# until文
my $i = 0;
until ($i >= 3) {
    print "$i \n";
    $i++;
}
> 0
> 1
> 2

# do {} while文
my $i = 0;
do {
    print "$i \n";
    $i++;
}
while ($i <= 2) ;
> 0
> 1
> 2

# do {} until文
my $i = 0;
do {
    print "$i \n";
    $i++;
}
until ($i >= 3) ;
> 0
> 1
> 2

# for文
for (my $i = 1; $i <= 3; $i++) {
    print "$i \n";
}
> 1
> 2
> 3

# foreach文
foreach my $i (1, 2, 3) {
    print "$i \n";
}
> 1
> 2
> 3

ループ制御

ループの流れを変えるために、次の3つの演算子が用意されています。

演算子内容
nextループをスキップする
lastループを終了する
redoループを先頭の位置まで戻してやり直す
# next演算子
for (my $i = 1; $i < 5; $i++) {
    if ($i == 3) { next; }
    print " $i \n";
}
> 1
> 2
> 4

# last演算子
for (my $i = 1; $i < 5; $i++) {
    if ($i == 3) { last; }
    print "$i \n";
}
> 1
> 2

# redo演算子
my $n = 0;
foreach my $i (1 .. 5) {
    print "$i \n";
    if ($i == 3) {
        $n++;
        last if ($n >= 2); # やり直しは2回で終了(無限ループ回避)
        # $iが3になったらループやり直し(ループの先頭へ移動する)
        redo;
    }
}
> 1
> 2
> 3
> 3
ページトップ