ルモーリン
ホーム更新サービス雑談ランドナーコースガイド鉄ゲタ自転車Linuxリンク連絡先

代入して判定で警告される

きっかけ


あれ、代入して判定するのは特に警告なかったよーな?

true代入で判定

うん、警告なかった。 こういう事があるのでメインフレーマーのソフトハウスに就職した際の新人教育で「左辺値式にできない物を等号比較する際は左辺に書く(意訳)」と教わりました。 当時は内製の言語を使っていて似たような記述ができたんだった。
#!/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代入で判定

0代入でwarningsによる警告出た。
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.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";
}