dorapon2000’s diary

忘備録的な。セキュリティとかネットワークすきです。

Perlのfalsyな値の==とeqによる比較結果

Perlのfalsyな値を比較した時、True/Falseのどちらになるか整理します。検証するfalsyな値は以下の4つです。

  • 空文字""
  • 数字の0
  • 文字列の"0"
  • undef

検証コードはGitHubにあげています。

github.com

検証環境

==で比較

==は数字が等しいかの判定に使う演算子です。

f:id:dorapon2000:20220330234747p:plain

結果は明快で、すべてがTrueになりました。表のうち*をつけたところは数字の比較ではないという警告が出ました。0と"0"の比較だけは数字の比較とみなしてくれたみたいです。

eqで比較

eqは文字列が等しいかの判定に使う演算子です。

f:id:dorapon2000:20220330234757p:plain

こちらは、"0"と空文字""の2グループに分けて考えられそうです。数字の0と文字列の0は"0"のグループ、空文字""とundefは空文字""のグループで、同じグループ同士のeqはTrueになり、そうでないならFalseでした。*が付けている部分は、比較にundefを扱う部分で、変数を初期化していないという警告が出ました。

❯ perl -E 'say undef'

undefは出力すると何も表示されないので、空文字と同列というのはわかる話です。

()について

空Arrayの()もfalsyな値です。ただ、空Arrayは実質undefなので、結果中はundefとしてまとめています。

say(defined ()    ? 1 : 0); # -> 0
say(defined undef ? 1 : 0); # -> 0
say(defined ""    ? 1 : 0); # -> 1
say(defined "0"   ? 1 : 0); # -> 1
say(defined 0     ? 1 : 0); # -> 1

# my @l = ();
my @l = undef;
$l[0] = "Hello";
say $l[0]; # -> Hello