主にプログラミング関連のメモ帳 ♪(✿╹ヮ╹)ノ
書いてあるコードは自己責任でご自由にどうぞ。記事本文の無断転載は禁止です。
2018/04/23
Perl 触ってて例えば、下のようなコードがあって、 $r
には何が入っているのかという問題。
sub is_even {
$_[0] % 2 == 0;
}
my $r = is_even(1); # false
print $r
としても何も表示されないので ''
だと思っていたのだけれども、違っていた。
例えば以下のコードはすべて true
として評価されるし、警告も出ない。
use feature qw/say/;
use strict;
use warnings;
my $r = 1 > 5; # false
if ($r eq '') {
say 'empty string';
}
if ($r == 0) {
say 'zero';
}
# こっちは警告だされる
# my $empty = '';
# say 'true 0' if $empty == 0;
調べてみると、 $r
に入っている値は '' でもあるし、 0 でもある 特殊な値とのこと。
(Special False Value だとか、 Special Perl False Value だとか言われているみたい)。
文字列が欲しい場所では ''
が返ってくるし、数値が欲しい場合は 0
がやってくる。 で、文字列と比較されようが、数値と比較されようが、警告が出ることもない。
どんな状態で Perl で保持されているかは、 XS 向けのデバッグライブラリで確認できる。
use Devel::Peek;
my $number = 0;
my $double = 0.0;
my $string = '';
my $boolean = !!0;
# IV = Integer, NV = Double, PV = String
Dump(\$number); # IV = 0
Dump(\$double); # NV = 0
Dump(\$string); # PV = ""\0
Dump(\$boolean); # IV = 0, NV = 0, PV = ""\0
ちなみに、この値が欲しければ !1
なり !!0
なりすれば得られる。
参考 :