![](http://oshiete.xgoo.jp/images/v2/pc/qa/question_title.png?e8efa67)
お世話になります。
真になる演算子が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
と出力されてしまいます。
これはなぜでしょうか。
よろしくお願いします。
No.3ベストアンサー
- 回答日時:
多分、and の優先順位が , よりも低いせいだと思う。
この回答への補足
上のTacosanさんの回答と合わせで納得しました。
http://perldoc.jp/docs/perl/perlop.pod
に演算子の結合順位が出ていますね。
私が書いた式の場合、,よりandの結合順位が低いので、andの前後で式が分断してしまうんですね。
どうもありがとうございました!
おお、なるほどですね!
ううーん、まだバッチリは分かりませんが、ありがとうございます!
引き続き何かありましたらよろしくお願いします!
No.4
- 回答日時:
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 などが導入されたんです.
No.2
- 回答日時:
>そうではなくて、3 = 3でリストは打ち切られてしまうということですね?
>それがなぜか知りたいのです。
なぜかって・・・演算子とか関数の優先順位を考えましょう
open my $fh, "<" , $file die croak("Cannot open $file");
なんかと同じです.
一般に関数の引数が優先順位が高いのと
引数の終端をどうやってみつけるかという話です
もし,期待通りにしたいのであれば
print "3 == 3 and 3 > 4:【", (3 == 3 and 3 > 4), "】\n";
です.
No.1
- 回答日時:
>真になる演算子が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
がでるかも
ご回答ありがとうございます。
すみません。間違えました。
×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です。
よろしくお願いします。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Perl perlをバージョンアップしたら、今まで正常に動いていたプログラムが、エラーになってしまった 3 2022/10/05 15:44
- 英語 The majority of currently available reviews focus 8 2022/08/07 05:55
- 英語 This paper focuses on the literature relevant to t 2 2022/12/02 09:41
- 英語 The Twilight Zone1959に関するCBSの回答について 1 2023/03/02 15:13
- YouTube youtubeからの著作権メールについて 2 2023/02/14 16:12
- Access(アクセス) アクセス where句を使用して複数条件抽出をするには 2 2022/08/29 13:24
- MySQL 参考書に従って入力したつもりでしたが、最後はエラーがでました。 1 2022/09/28 03:45
- 英語 和訳の手伝いをお願いします 2 2023/02/27 11:42
- 英語 Greater stress was reported in axial direction at 1 2022/07/20 12:46
- TOEFL・TOEIC・英語検定 英検準1級英作文の添削をお願いします。 ポイントはCurriculumとGlobalizationを 4 2023/05/29 11:33
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
window.open でのファイル指定方法
-
PerlでのUseless use...
-
WindowsでPerlをする際,1行目の...
-
VBA テキストファイルを読み取...
-
巨大なテキストの最終行を取得...
-
配列をまるごとフォルダにコピ...
-
ExcelをCSV書き出す場合のシー...
-
ReadLineでの読み出し行を指定する
-
VBAでCSVファイルの特定行を書...
-
awkスクリプトでダブルクォーテ...
-
エクセルVBA コードが同じでも...
-
タブの色を変更する方法
-
CSVデータの編集の際の重複チェ...
-
サーバーにある特定の拡張子フ...
-
指定したフォルダにアップロード
-
batファイルでrenameができませ...
-
パスから最後のディレクトリだ...
-
Perlの初心者です。2重ループ...
-
Perlの質問:行と列を入れ替え...
-
Perl<->Oracle間での文字化けに...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
python renameについて
-
fgets で値が取得できない
-
window.open でのファイル指定方法
-
巨大なテキストの最終行を取得...
-
ファイル全てを .xlsm に変更し...
-
read() on unopened filehandle...
-
csvファイルの横方向への改行に...
-
VBAコードを張り付け後のエクセ...
-
Firefox で file:// で始まる U...
-
JSP URLに表示される拡張子 .jsp
-
drtファイルはどうしたら開...
-
並び方、
-
重複ファイル名ある場合ファイ...
-
VBA テキストファイルを読み取...
-
cgiでサーバーにファイルを追加...
-
HTMLのフォームで画像と文...
-
WindowsでPerlをする際,1行目の...
-
バイナリファイルの出力
-
Perlでのパーミッション変更の仕方
-
foreach内での変数の扱い?
おすすめ情報