blog20100901

2013/08/20 - プログラミング言語 Perl にまつわる etc. - Perl monger
参考 : perldoc, perldoc.jp, search.cpan.org, perldoc.perl.org ...
「 初めての Perl 第 6 版 」(オライリー・ジャパン発行 ISBN978-4-87311-567-2) 」
「 続・初めての Perl 改訂版 」(オライリー・ジャパン発行 ISBN4-87311-305-9) 」
「 Effective Perl 第 2 版 」(翔泳社発行 ISBN978-4-7981-3981-4) 」 ... etc,.

Perl Perl_1

Perl 「 条件演算子 」?: (0x88)

Perl 「 条件演算子 」?: (0x88)

目次 - Perl Index



Theme



Perl について、復習を兼ねて断片的な情報を掲載して行く連載その 0x88 回。

Perl の条件演算子 ( conditional operator )「 ?: 」について。




条件演算子とは



条件演算子 - Wikipedia では、冒頭で次の様に説明されています。

条件文と同様な意味があるが、文ではなく値を持つ式になる。評価されると、条件式の値により異なる式が評価され、異なる値になる。


「 条件演算子 」は、条件分岐をする「 if 」等の条件文と同等ですが、「 文 」ではなく「 式 」であり、条件文の様な「 文 」の記述が出来ません。また、「 式 」であることから値を持ちます。

これから確認する Perl の条件演算子は、C 言語から影響を受けた三項演算子です。

プログラミング言語の条件演算子の中には、一部二項演算子がある様ですが、一般的には C 言語ライクな三項演算子がその代表格となっているため、「 三項演算子 = 条件演算子 」という扱いがされている様です。

英語版 Wikipedia の解説



英語版の Wikipedia では次の様にあります。

これは、「 三項演算 」( Ternary operation ) のページの冒頭です。

"Ternary operation"

For the ternary "if" operator in C-like languages, see ?:.
(三項の "if" 演算子は C ライクな言語の, 参照してください ?: を.)


「 ?: 」を参照してみましょう。

"?:"

In computer programming, ?: is a ternary operator that is part of the syntax for a basic conditional expression in several programming languages.
(コンピュータプログラミングでは, ?: は三項演算子で 構文の一部です 基本的な条件式の いくつかのプログラミング言語で.)

It is commonly referred to as the conditional operator, inline if (iif), or ternary if.
(これは 一般的に呼ばれます 条件演算子と, インラインの if (iif), または 三項の if で.)

It originally comes from CPL, in which equivalent syntax for e1 ? e2 : e3 was e1 → e2, e3.[1][2]
(元々は CPL 由来で, e1 ? e2 : e3 と等価な構文は e1 -> e2, e3 でした.)

Although many ternary operators are possible, the conditional operator is so common, and other ternary operators so rare, that the conditional operator is commonly (albeit incorrectly) referred to as the ternary operator.
(三項演算子は受け入れられているが, 通常条件演算子として, 他の三項演算子はとても稀なので, 条件演算子は一般的に (間違いではあるが) 呼ばれる 三項演算子と.)


書いてあることはほとんど日本語と同じです。

本来は間違いではあるものの、プログラミング言語では条件演算子以外の三項演算子がほとんど存在しないため、「 三項演算子 = 条件演算子 」として一般的に受け入れられているということです。

三項演算子の源泉は C 言語よりも古い「 CPL 」( Combined Programming Language ) にある様ですが、Perl の場合は C 言語の影響が大きい様です。

このページの項目名にある「 ?: 」は、C 言語および Perl で利用する条件演算子です。

「 ?: 」



Perl の条件演算子「 ?: 」は、C 言語と同様に「 if then else 」文の様に働く演算子です。

条件演算子の書式は次の様なものです。


EXPR ? IF_TRUE_EXPR : IF_FALSE_EXPR


まず、条件演算子では、「 ? 」の前に置かれた「 EXPR 」の 真偽 を評価します。

もし「 EXPR 」が 真 ならば、「 ? 」の直後に置かれた「 IF_TRUE_EXPR 」の値を返します。

反対に、もし「 EXPR 」が 偽 ならば、「 : 」の直後に置かれた「 IF_FALSE_EXPR 」を返します。

「 ?: 」を利用する



条件演算子「 ?: 」の具体的な利用例を確認します。

次の例では, スカラ変数 $ok の評価が 真 なら、 数値 1 を、偽 なら数値 0 をスカラ変数 $result に代入します。これはスカラコンテキストです。


$result = $ok ? 1 : 0;


これを if 文で書くと次の様になります。


if ( $ok ) {
$result = 1;
} else {
$result = 0;
}


リストコンテキストの場合はリストを返します。


@member = $ok ? @starter : @sub;


この場合、$ok の評価が 真 なら配列変数 @starter の要素を、偽 なら @sub の要素を @member に代入します。

もし、配列変数 @member がスカラ変数 $member だった場合は、スカラコンテキストになるため、$member には配列の要素 "数" が返されます。


$member = $ok ? @starter : @sub;


さらに例えば、条件演算子は、次の様にサブルーチンからの戻り値を判定する場合にも有用です。


$return = &sub( $value ) ? "ok" : "no";


条件演算子の 真偽値 には式を置くことも出来ます。


$result = $n < 10 ? $n + 10 : $n;


少しややこしいですが、次の様な利用方法も可能です。


($result ? $a : $b) = $c;


これは、$result の 真偽 によって、$c の代入先を $a と $b に振り分けています。つまり、真 なら $a に、偽 なら $b に $c の値を代入します。

また、perlop - perldoc.jp "条件演算子" の項には「 ( ) 」の使い方について次の様な例がありました。

まず、「 ( ) 」のない状態の次の式


$a % 2 ? $a += 10 : $a += 2;


は、次の式と同じ意味を持ちます。


(($a % 2) ? ($a += 10) : $a) += 2;


これは、「 $a % 2 」の結果が 真 だった場合 (つまり、2 で除算して剰余が有った場合 ) は「 $a 」に 10 を加算 ( $a += 10 ) して、さらに 2 を加算 ( += 2 ) します。

反対に結果が 偽 だった場合 ( つまり, 2 で除算して剰余が無かった場合 ) は 「 $a 」に 2 だけを加算 ( += 2 ) します。

もし、あなたが、 真 の場合は 10 のみを加算し、偽 の場合は 2 のみを加算させたい場合は、「 ( ) 」を次の様に利用する必要があります。


($a % 2) ? ($a += 10) : ($a += 2);


また、仮にそうであるならば、次の様に書くことが望ましいとされています。


$a += ($a % 2) ? 10 : 2;


条件演算子を使った多方向分岐



Perl の条件演算子は、これまで見て来た通り 3 つの項 ( EXPR, IF_TRUE_EXPR, IF_FALSE_EXPR ) を取りますが、「 IF_FALSE_EXPR 」に条件演算子を入れ込むことで、if elsif else の構文の様に多方向の条件分岐を作ることが出来ます。


$grade =
($score > 99 ) ? "Perfect !!" :
($score > 79 ) ? "good !" :
($score > 59 ) ? "so-so." :
($score > 39 ) ? "hmm.." :
"Be serious..."; # dafault


0x88 -> 0x89 へ



条件演算子は、使い方によってはややこしく見えますが、使い方によってはとても便利になる様です。

式修飾子等と同様に、適宜使いこなせる様になりたいものです。

参考情報は書籍「 初めての Perl 第 6 版 」を中心に perldoc, Wikipedia および各 Web サイト。それと詳しい先輩。

目次 - Perl Index
















同じカテゴリー(Perl)の記事
 Perl mp2 翻訳 Web コンテンツ圧縮の FAQ (d228) (2023-10-11 23:49)
 Perl mp2 翻訳 既知のブラウザのバグの回避策をいくつか (d227) (2023-05-26 15:41)
 Perl mp2 翻訳 Perl と Apache でのキュートなトリック (d226) (2023-05-19 17:05)
 Perl mp2 翻訳 テンプレートシステムの選択 (d225) (2022-08-15 22:23)
 Perl mp2 翻訳 大規模 E コマースサイトの構築 (d224) (2022-06-15 20:43)
 Perl mp2 翻訳 チュートリアル (d223) (2022-06-15 20:42)

Llama
リャマ
TI-DA
てぃーだブログ
プロフィール
セラ (perlackline)
セラ (perlackline)
QRコード
QRCODE
オーナーへメッセージ

PAGE TOP ▲