質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.49%
Perl

Perlは多目的に使用される実用性が高い動的プログラミング言語のひとつです。

Q&A

解決済

2回答

1979閲覧

三項演算子の挙動についてお教えください

circus55

総合スコア66

Perl

Perlは多目的に使用される実用性が高い動的プログラミング言語のひとつです。

0グッド

1クリップ

投稿2015/07/30 13:38

編集2015/07/30 14:02

perl

1use strict; 2use warnings; 3 4my %hash = ('1'=>10, '3'=>9, '5'=>8, '7'=>7, '9'=>6); 5my ($one, $other) = (0, 0); 6 7for my $k (sort { $b cmp $a } keys %hash) { 8 ($k ne '1') ? $other += $hash{$k} : $one = $hash{$k}; 9} 10 11print $one, " と ", $other;

上記のようなコードの時、
感覚的には、「10と30」のように表示してほしいのですが、
どうしてか、「10と9」と表示されます。

perl

1#($k ne '1') ? $other += $hash{$k} : $one = $hash{$k}; 2if ($k ne '1') { 3 $other += $hash{$k}; 4} else { 5 $one = $hash{$k}; 6}

三項演算子の部分を、上記のように変更すると期待通りの結果が表示されるのですが、
今ひとつ理解に苦しんでいます・・・

初歩的な質問ですが、三項演算子でなぜ「10と30」とならないのかお教えください。
perlのバージョンは、5.18.2です。
よろしくお願いします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

ベストアンサー

こうすれば上手くいくと思います。(v5.18.2で確認)

lang

1($k ne '1') ? ( $other += $hash{$k} ) : ( $one = $hash{$k} );

うまく説明できないのですが、Perlの場合は「コンテキスト」(文脈)と演算子の優先順位の関係でこうなるようです。
詳しくは、下記リンク先の条件演算子の項を参照してください。

参考リンク:
perlop - Perl の演算子と優先順位 - perldoc.jp

投稿2015/07/30 14:09

argius

総合スコア9388

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

circus55

2015/07/30 14:17

教えていただいたリンク先のページで、どう式の解釈がされるのか理解しました。 ありがとうございました
guest

0

うーんこれはPerl関係ないかと思います。
PHPでもJavascriptでも考え方は同じです。

A ? B : C

上記三項演算子は、「Aが正(成立する)ならばBを実行、偽(成立しない)ならばCを実行」となります。
これをif文にすると、
if (A) {
B
} else {
C
}
となります。

…と、ここまでこれば大体お分かりかと思いますが、三項演算子とIF構文でCの式が違うために得られる結果が違うのではないでしょうか。

投稿2015/07/30 13:54

yu-ri

総合スコア634

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

circus55

2015/07/30 14:03

すみません、質問のコードの変数名が間違っていました・・・ 修正しました。 三項演算子でもif分でも、Cの式は同じ式なのに結果が違うのです・・・ 三項演算子の場合とif文の場合、式が変わってしまうのでしょうか? その場合、どのような式で解釈されてしまうのでしょうか・・・?
yu-ri

2015/07/30 14:18

おお…そうでしたか(汗 既に回答が出ておりますが、Perlは演算子の優先順位についてちょっと毛色が違うようですね。私も勉強になりました。
circus55

2015/07/30 14:23

確認が足らず、いらぬ混乱を出しました、すみませんでした ありがとうございました
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.49%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問