代入して判定で警告される
投稿:2018-05-01
あれ、代入して判定するのは特に警告なかったよーな?
うん、警告なかった。
こういう事があるのでメインフレーマーのソフトハウスに就職した際の新人教育で「左辺値式にできない物を等号比較する際は左辺に書く(意訳)」と教わりました。
当時は内製の言語を使っていて似たような記述ができたんだった。
#!/usr/bin/perl use utf8; use strict; use warnings; use boolean; my $flag = false; if ($flag = true) { Hoge(); # どうしてかこっちにいく } else { Fuga(); } exit; sub Hoge { print "Hoge\n"; } sub Fuga { print "Fuga\n"; }
0代入でwarningsによる警告出た。
「スカラ値は、その値が未定義値か空文字列か数値の 0 (あるいは同値な文字列 "0") の場合には、真偽値の偽として扱われ、それ以外のもの全てでは 真として扱われます。」
perldata - Perl のデータ型 - perldoc.jp
Found = in conditional, should be == at sample_30.pl line 10.これは知りませんでした。 やっぱりstrictとwarnings大事。 とすると上記のコードは何で警告ないの?
#!/usr/bin/perl use utf8; use strict; use warnings; # これで警告が出る my $flag = 1; if ($flag = 0) { Hoge(); } else { Fuga(); # こっちに来る } exit; sub Hoge { print "Hoge\n"; } sub Fuga { print "Fuga\n"; }でも0だからelse節に行ってる。 0でthen節に行くってどういうことだろう?
「スカラ値は、その値が未定義値か空文字列か数値の 0 (あるいは同値な文字列 "0") の場合には、真偽値の偽として扱われ、それ以外のもの全てでは 真として扱われます。」
perldata - Perl のデータ型 - perldoc.jp
"0.0"なら警告が出るし真になるけれどコレじゃなさそう。
どうやったら0代入で真になるのだろう、興味津々。
#!/usr/bin/perl use utf8; use strict; use warnings; # これで警告が出る my $flag = 1; if ($flag = "0.0") { Hoge(); # こっちに来る } else { Fuga(); } exit; sub Hoge { print "Hoge\n"; } sub Fuga { print "Fuga\n"; }
警告の有無はどこから来るのだろう?
リテラルを代入すると判定はいつも一緒だから警告してそう。
変数から代入すると警告しなかった。
booleanのtrue/falseはリテラルじゃないのかも。
#!/usr/bin/perl use utf8; use strict; use warnings; my $flag = 1; my $zero = 0; if ($flag = $zero) { Hoge(); } else { Fuga(); # こっちに来る } exit; sub Hoge { print "Hoge\n"; } sub Fuga { print "Fuga\n"; }