Data-Dumper-Interp
view release on metacpan or search on metacpan
lib/Data/Dumper/Interp.pm view on Meta::CPAN
sub _is_bool(_) {
_SUPPORTS_CORE_BOOLS && builtin::is_bool($_[0])
}
sub _show_as_number(_) {
my $value = shift;
# IMPORTANT: We must not do any numeric ops or comparisions
# on $value because that may set some magic which defeats our attempt
# to try bitstring unary & below (after a numeric compare, $value is
# apparently assumed to be numeric or dual-valued even if it
# is/was just a "string").
return 0 if !defined $value;
# if the utf8 flag is on, it almost certainly started as a string
return 0 if (ref($value) eq "") && utf8::is_utf8($value);
return 0 if _is_bool($value);
# There was a Perl bug where looks_like_number() provoked a warning from
# BigRat.pm if it is called under 'use bigrat;' so we must not do that.
# https://github.com/Perl/perl5/issues/20685
#return 0 unless looks_like_number($value);
# JSON::PP uses these tricks:
# string & "" -> "" # bitstring AND, truncating to shortest operand
# number & "" -> 0 (with warning)
# number * 0 -> 0 unless number is nan or inf
# Attempt uniary & with "string" and see what happens
my $uand_str_result = eval {
use warnings "FATAL" => "all"; # Convert warnings into exceptions
no if $bitwise_supported, "feature", "bitwise";
no warnings "once";
# Use FF... so we can see what $value was in debug messages below
my $dummy = ($value & "\x{FF}\x{FF}\x{FF}\x{FF}\x{FF}\x{FF}\x{FF}\x{FF}");
};
btw '##_san $value \$@=$@' if $Debug;
if ($@) {
if ($@ =~ /".*" isn't numeric/) {
return 1; # Ergo $value must be numeric
}
if ($@ =~ /\& not supported/) {
# If it is an object then it probably (but not necessarily)
# is numeric but just doesn't support bitwise operators,
# for example BigRat.
return 1 if defined blessed($value);
}
if ($@ =~ /no method found/) { # overloaded but does not do '&'
# It must use overloads, but does not implement '&'
# Assume it is string-ish
return 0 if defined blessed($value); # else our mistake, isn't overloaded
}
warn "# ".__PACKAGE__." : value=",_dbshow($value),
"\n Unhandled warn/exception from unary & :$@\n"
if $Debug;
# Unknown problem, treat as a string
return 0;
}
elsif (ref($uand_str_result) ne "" && $uand_str_result =~ /NaN|Inf/) {
# unary & returned an object representing Nan or Inf
# (e.g. Math::BigFloat) so $value must be numberish.
return 1;
}
warn "# ".__PACKAGE__." : (value & \"...\") succeeded\n",
" value=", _dbshow($value), "\n",
" uand_str_result=", _dbvis($uand_str_result),"\n"
if $Debug;
# Sigh. With Perl 5.32 (at least) $value & "..." stringifies $value
# or so it seems.
if (blessed($value)) {
# +42 might throw if object is not numberish e.g. a DateTime
if (blessed(eval{ $value + 42 })) {
warn " Object and value+42 is still an object, so probably numberish\n"
if $Debug;
return 1
} else {
warn " Object and value+42 is NOT an object, so it must be stringish\n"
if $Debug;
return 0
}
} else {
warn " NOT an object, so must be a string\n",
if $Debug;
return 0;
}
}# _show_as_number
# Split keys into "components" (e.g. 2_16.A has 3 components) and sort
# components containing only digits numerically.
sub __sortkeys {
my $hash = shift;
my $r = [
sort { my @a = split /(?<=\d)(?=\D)|(?<=\D)(?=\d)/,$a;
my @b = split /(?<=\d)(?=\D)|(?<=\D)(?=\d)/,$b;
for (my $i=0; $i <= $#a; ++$i) {
return 1 if $i > $#b; # a is longer
my $r = ($a[$i] =~ /^\d+$/ && $b[$i] =~ /^\d+$/)
? ($a[$i] <=> $b[$i]) : ($a[$i] cmp $b[$i]) ;
return $r if $r != 0;
}
return -1 if $#a < $#b; # a is shorter
return 0;
}
keys %$hash
];
$r
}
my $quoted_re = RE_quoted(-delim => q{'"});
my $balanced_re = RE_balanced(-parens=>'{}[]()');
# cf man perldata
my $userident_re = qr/ (?: (?=\p{Word})\p{XID_Start} | _ )
(?: (?=\p{Word})\p{XID_Continue} )* /x;
my $pkgname_re = qr/ ${userident_re} (?: :: ${userident_re} )* /x;
our $curlies_re = RE_balanced(-parens=>'{}');
( run in 2.727 seconds using v1.01-cache-2.11-cpan-39bf76dae61 )