fork download
  1. use warnings;
  2. use strict;
  3. use feature ':5.10';
  4.  
  5. use B;
  6.  
  7. # Type and flags for reference
  8. my $obj = B::svref_2object(\(my $dummy = !!1));
  9. my $TYPE = $obj->SvTYPE;
  10. my $FLAGS = $obj->FLAGS;
  11.  
  12. sub looks_like_bool {
  13. my $bool = shift;
  14.  
  15. # Compare type
  16. my $obj = B::svref_2object(\$bool);
  17. return !!0 unless $obj->SvTYPE == $TYPE;
  18.  
  19. # Compare flags
  20. return !!0 unless $obj->FLAGS == $FLAGS;
  21.  
  22. # True value
  23. return !!1 if $bool eq !!1;
  24.  
  25. # False value
  26. return !!1 if $bool eq !!0;
  27.  
  28. # Not a boolean
  29. return !!0;
  30. }
  31.  
  32. print "----boolean----\n";
  33. for (
  34. {say => 'Boolean true', var => !!1},
  35. {say => 'Boolean false', var => !!0}
  36. ) {
  37. say $_->{say} if looks_like_bool $_->{var};
  38. }
  39. print "----non-boolean----\n";
  40. for (
  41. {say => 'Random string', var => 'whatever'},
  42. {say => 'Random integer', var => 23},
  43. {say => 'Random float', var => 23.23},
  44. {say => 'Fake false', var => 0e0},
  45. {say => '0 but true', var => '0 but true'},
  46. {say => 'An arrayref', var => []},
  47. ) {
  48. say $_->{say} unless looks_like_bool $_->{var};
  49. }
Success #stdin #stdout 0.01s 5056KB
stdin
Standard input is empty
stdout
----boolean----
Boolean true
Boolean false
----non-boolean----
Random string
Random integer
Random float
Fake false
0 but true
An arrayref