Perlのfalsyな値を比較した時、True/Falseのどちらになるか整理します。検証するfalsyな値は以下の4つです。
- 空文字""
- 数字の0
- 文字列の"0"
- undef
検証コードはGitHubにあげています。
検証環境
- Perl v5.34.0
==で比較
==
は数字が等しいかの判定に使う演算子です。
結果は明快で、すべてがTrueになりました。表のうち*をつけたところは数字の比較ではないという警告が出ました。0と"0"の比較だけは数字の比較とみなしてくれたみたいです。
eqで比較
eq
は文字列が等しいかの判定に使う演算子です。
こちらは、"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