お世話になります。
真になる演算子が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も見ています
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
csvファイルの横方向への改行に...
-
perl ファイルが開かない
-
VBAコードを張り付け後のエクセ...
-
重複ファイル名ある場合ファイ...
-
fopen64について
-
AutoNts
-
ファイル全てを .xlsm に変更し...
-
行を指定して削除する方法PERL
-
cgiでサーバーにファイルを追加...
-
VBA テキストファイルを読み取...
-
Perlでファイルの末尾から指定...
-
VBAで巨大なファイルの途中から...
-
ファイルがオープンできない
-
Perlで特定文字列から特定文字...
-
Perlで行をさかのぼって削除す...
-
C#でCSVファイルを逐一更新したい
-
複数のCSVファイルを一つのCSV...
-
データの日付でソートをしたい
-
CSVが可変長の場合の検索方法
-
FindFirstFileとFindNextFileで...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
window.open でのファイル指定方法
-
fgets で値が取得できない
-
VBA テキストファイルを読み取...
-
ファイル全てを .xlsm に変更し...
-
csvファイルの横方向への改行に...
-
Firefox で file:// で始まる U...
-
VBAコードを張り付け後のエクセ...
-
python renameについて
-
JSP URLに表示される拡張子 .jsp
-
foreach内での変数の扱い?
-
HTMLのフォームで画像と文...
-
drtファイルはどうしたら開...
-
PerlでのUseless use...
-
MySQLにバイナリデータを正常に...
-
複数ファイルを1つにするシェ...
-
テキストファイルの高速な読み...
-
巨大なテキストの最終行を取得...
-
並び方、
-
ファイルの存在の有無を確かめ...
-
Perl の「stringify」の意味に...
おすすめ情報