プロが教える店舗&オフィスのセキュリティ対策術

お世話になります。
真になる演算子が1を、偽になる演算子がundefを返すことを研究しています。

print "3 == 3:【", 3 == 3, "】\n";

であれば、3 = 3が1を返すので

3 = 3:【1】

となります。

print "3 > 4:【", 3 > 4, "】\n";

であれば、3 > 4がundefになるので

3 > 3:【】

になります。

さて、and 演算子を使ったところも見たいと重い、

print "3 == 3 and 3 > 4:【", 3 = 3 and 3 > 4, "】\n";

と書いて実行すると
Useless use of a constant in void context at C:\Perl\perl\showAndTF.pl line 8.
という警告と共に

3 == 3 and 3 > 4:【1

と出力されてしまいます。
これはなぜでしょうか。
よろしくお願いします。

A 回答 (4件)

多分、and の優先順位が , よりも低いせいだと思う。

この回答への補足

上のTacosanさんの回答と合わせで納得しました。
http://perldoc.jp/docs/perl/perlop.pod
に演算子の結合順位が出ていますね。

私が書いた式の場合、,よりandの結合順位が低いので、andの前後で式が分断してしまうんですね。

どうもありがとうございました!

補足日時:2012/09/10 11:25
    • good
    • 0
この回答へのお礼

おお、なるほどですね!
ううーん、まだバッチリは分かりませんが、ありがとうございます!

引き続き何かありましたらよろしくお願いします!

お礼日時:2012/09/09 14:26

Perl が持っている論理演算子は, もともと (C に由来する) &&, || などのみでした. リストを作る演算子 , はこれらより優先順位が低いので, 例えば


print "3 == 3 && 3 > 4:【", 3 = 3 && 3 > 4, "】\n";

print "3 == 3 && 3 > 4:【", (3 = 3 && 3 > 4), "】\n";
という解釈をします.

ところが, 論理演算子を制御構造として使おうとするとこの動作は不都合です. 例えば, #2 のように「open できなかったら~」というのを表そうと
open my $fh, "<" , $file || die croak("Cannot open $file");
としちゃうと
open my $fh, "<" , ($file || die croak("Cannot open $file"));
を意味するけど, これは明らかに期待した動作じゃない.

で, このようなときのために「演算子 , よりさらに優先順位が低い論理演算子」として and や or などが導入されたんです.
    • good
    • 0
この回答へのお礼

ありがとうございます!
私は||、&&を使わないでand、orを使っていましたが、優先順位が違うんですね。

お礼日時:2012/09/10 11:23

>そうではなくて、3 = 3でリストは打ち切られてしまうということですね?


>それがなぜか知りたいのです。

なぜかって・・・演算子とか関数の優先順位を考えましょう

open my $fh, "<" , $file die croak("Cannot open $file");

なんかと同じです.

一般に関数の引数が優先順位が高いのと
引数の終端をどうやってみつけるかという話です


もし,期待通りにしたいのであれば

print "3 == 3 and 3 > 4:【", (3 == 3 and 3 > 4), "】\n";

です.
    • good
    • 0

>真になる演算子が1を、偽になる演算子がundefを返すことを研究しています。



何をやってるのかさっぱりわからんけど・・・
ついでにいうと,Perlのバージョンも明記せんとだめ
5.10.0だとぜんぜん違うエラーになるし
表示もちがうから

Perlの場合
print ってのが
実はリストを受け取る「関数」だということを知ってますか?

>print "3 == 3 and 3 > 4:【", 3 = 3 and 3 > 4, "】\n";

ってのは

print ("3 == 3 and 3 > 4:【", 3 = 3) and 3 > 4, "】\n";

と同じでしょうね.

ついでにいうと,3=3 の段階で,既に問題があるから
Can't modify constant item in scalar assignment
がでるかも
    • good
    • 0
この回答へのお礼

ご回答ありがとうございます。

すみません。間違えました。
×print "3 == 3 and 3 > 4:【", 3 = 3 and 3 > 4, "】\n";
○print "3 == 3 and 3 > 4:【", 3 == 3 and 3 > 4, "】\n";
です。

おっしゃるとおりprint関数の第一引数に
"3 == 3 and 3 > 4:【"
という文字列を、第二引数に
3 = 3 and 3 > 4
という論理式を、第三引数に
"】\n"
という文字列を渡そうとしています。

結果として

3 == 3 and 3 > 4:【】

という結果を得たいと思っていました。
(【と】の間は偽になるので)

そうではなくて、3 = 3でリストは打ち切られてしまうということですね?
それがなぜか知りたいのです。

Perl は5.8.8です。
よろしくお願いします。

お礼日時:2012/09/09 10:36

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!