代入して判定で警告される
投稿: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";
}
