三項演算子 A ? B : C
Perlには、条件によって、返却する値を変えることができる三項演算子というものがあります。
条件 ? 真の場合に返す値 : 偽の場合に返す値
上の構文だけ見ると少しわかりにくいので、実際にサンプルを書いてみます。
my $flag = 1; my $num = $flag ? 3 : 5;
「$flag」が「1」で真の値です。三項演算子は条件が真の場合には「?」の直後の値を返却します。ですので「3」が「$num」に代入されます。
次は、条件が偽の場合のサンプルです。
my $flag = 0; my $num = $flag ? 3 : 5;
「$flag」が「0」で偽の値です。三項演算子は条件が真の場合には「:」の直後の値を返却します。ですので「5」が代入されます。
三項演算子は慣れるまでは少し読みにくい構文です。前半だけを見ると「$num」に「$flag」が代入されているように思えるかもしれません。
でも「$flag」が代入されるのではなく、「$flag」が条件になっていて、条件に応じて「?の直後」あるいは「:の直後」の値が返却されます。
Perlの真偽値について詳しく知りたい場合は、以下の記事を参考にしてください。
ifで書くのとの違いは?
三項演算子で書けることはif文でもそのまま書けます。
my $flag = 1; my $num; if ($flag) { $num = 3; } else { $num = 5; }
違いは、三項演算子は短く書けるということと値を返せるということです。
この利点を生かすと、たとえばMojoliciousのテンプレートの中で、こんな風に書けます。
<%= $flag ? 3 : 5 %>
if文で書くより省略でき、1行で短くスッキリ書けましたね。
複数の条件が連続する三項演算子
三項演算子は、複数の条件を連続させて使用することができます。ネストされている場合も読めるようにしておきましょう。
my $flag = 1; my $num = $flag == 1 ? 3 : $flag == 2 ? 5 : 7;
少し読みにくいですが、最初に書いたとおり読んでいきます。
- 「$flag」が「1」の場合は「3」が返却されます。
- そうでない場合は「:」の後ろが実行されます。つまり、その後に続く三項演算子が実行されます。
- 「$flag」が「2」の場合は「5」が返却されます。
- そうでない場合は「:」の後ろが実行されます。つまり「7」が返却されます。
サンプルプログラム
三項演算子のサンプルプログラムです。
use strict; use warnings; # 三項演算子 my $num1 = 1; my $num2 = 2; print "1. 三項演算子の例( if ~ else を置き換える )\n"; my $max_num = $num1 > $num2 ? $num1 : $num2; print "\$max_num = $max_num\n\n"; #以下のif ~ else 文と同じ if ($num1 > $num2) { $max_num = $num1 } else { $max_num = $num2 } my $age = 23; print "2. 三項演算子の例(if ~ elsif ~ を置き換える)\n"; my $generation = $age < 20 ? 'child' : $age < 60 ? 'middle' : $age < 80 ? 'old' : 'very old'; print "\$generation = $generation\n"; #以下のif ~ elsif文と同じ if ($age < 20) { $generation = 'child' } elsif ($age < 60) { $generation = 'middle' } elsif ($age < 80) { $generation = 'old' } else { $generation = 'very old' }