use warnings;
use strict;
use feature ':5.10';
use B;
# Type and flags for reference
my $obj = B::svref_2object(\(my $dummy = !!1));
my $TYPE = $obj->SvTYPE;
my $FLAGS = $obj->FLAGS;
sub looks_like_bool {
# Compare type
my $obj = B::svref_2object(\$bool);
return !!0 unless $obj->SvTYPE == $TYPE;
# Compare flags
return !!0 unless $obj->FLAGS == $FLAGS;
# True value
# False value
# Not a boolean
}
print "----boolean----\n"; for (
{say => 'Boolean true', var => !!1},
{say => 'Boolean false', var => !!0}
) {
say $_->{say} if looks_like_bool $_->{var};
}
print "----non-boolean----\n"; for (
{say => 'Random string', var => 'whatever'},
{say => 'Random integer', var => 23},
{say => 'Random float', var => 23.23},
{say => 'Fake false', var => 0e0},
{say => '0 but true', var => '0 but true'},
{say => 'An arrayref', var => []},
) {
say $_->{say} unless looks_like_bool $_->{var};
}
dXNlIHdhcm5pbmdzOwp1c2Ugc3RyaWN0Owp1c2UgZmVhdHVyZSAnOjUuMTAnOwoKdXNlIEI7CgojIFR5cGUgYW5kIGZsYWdzIGZvciByZWZlcmVuY2UKbXkgJG9iaiA9IEI6OnN2cmVmXzJvYmplY3QoXChteSAkZHVtbXkgPSAhITEpKTsKbXkgJFRZUEUgPSAkb2JqLT5TdlRZUEU7Cm15ICRGTEFHUyA9ICRvYmotPkZMQUdTOwoKc3ViIGxvb2tzX2xpa2VfYm9vbCB7CiAgbXkgJGJvb2wgPSBzaGlmdDsKCiAgIyBDb21wYXJlIHR5cGUKICBteSAkb2JqID0gQjo6c3ZyZWZfMm9iamVjdChcJGJvb2wpOwogIHJldHVybiAhITAgdW5sZXNzICRvYmotPlN2VFlQRSA9PSAkVFlQRTsKCiAgIyBDb21wYXJlIGZsYWdzCiAgcmV0dXJuICEhMCB1bmxlc3MgJG9iai0+RkxBR1MgPT0gJEZMQUdTOwoKICAjIFRydWUgdmFsdWUKICByZXR1cm4gISExIGlmICRib29sIGVxICEhMTsKCiAgIyBGYWxzZSB2YWx1ZQogIHJldHVybiAhITEgaWYgJGJvb2wgZXEgISEwOwoKICAjIE5vdCBhIGJvb2xlYW4KICByZXR1cm4gISEwOwp9CgpwcmludCAiLS0tLWJvb2xlYW4tLS0tXG4iOwpmb3IgKAogIHtzYXkgPT4gJ0Jvb2xlYW4gdHJ1ZScsIHZhciA9PiAhITF9LAogIHtzYXkgPT4gJ0Jvb2xlYW4gZmFsc2UnLCB2YXIgPT4gISEwfQogKSB7CiAgc2F5ICRfLT57c2F5fSBpZiBsb29rc19saWtlX2Jvb2wgJF8tPnt2YXJ9Owp9CnByaW50ICItLS0tbm9uLWJvb2xlYW4tLS0tXG4iOwpmb3IgKAogIHtzYXkgPT4gJ1JhbmRvbSBzdHJpbmcnLCB2YXIgPT4gJ3doYXRldmVyJ30sCiAge3NheSA9PiAnUmFuZG9tIGludGVnZXInLCB2YXIgPT4gIDIzfSwKICB7c2F5ID0+ICdSYW5kb20gZmxvYXQnLCB2YXIgPT4gIDIzLjIzfSwKICB7c2F5ID0+ICdGYWtlIGZhbHNlJywgdmFyID0+ICAwZTB9LAogIHtzYXkgPT4gJzAgYnV0IHRydWUnLCB2YXIgPT4gJzAgYnV0IHRydWUnfSwKICB7c2F5ID0+ICdBbiBhcnJheXJlZicsICB2YXIgPT4gW119LAogKSB7CiAgc2F5ICRfLT57c2F5fSB1bmxlc3MgbG9va3NfbGlrZV9ib29sICRfLT57dmFyfTsKfQ==