File Coverage

blib/lib/Data/Printer/Filter/SCALAR.pm
Criterion Covered Total %
statement 69 69 100.0
branch 27 32 84.3
condition 20 21 95.2
subroutine 13 13 100.0
pod 0 1 0.0
total 129 136 94.8


line stmt bran cond sub pod time code
1             package Data::Printer::Filter::SCALAR;
2 35     35   234 use strict;
  35         77  
  35         1318  
3 35     35   165 use warnings;
  35         83  
  35         1707  
4 35     35   17570 use Data::Printer::Filter;
  35         90  
  35         281  
5 35     35   214 use Scalar::Util;
  35         91  
  35         2211  
6              
7 35     35   280 use constant HAS_BOOLEAN => $] ge '5.036000';
  35         101  
  35         12039  
8              
9             filter 'SCALAR' => \&parse;
10             filter 'LVALUE' => sub {
11             my ($scalar_ref, $ddp) = @_;
12             my $string = parse($scalar_ref, $ddp);
13             if ($ddp->show_lvalue) {
14             $string .= $ddp->maybe_colorize(' (LVALUE)', 'lvalue');
15             }
16             return $string;
17             };
18              
19             sub parse {
20 328     328 0 783 my ($scalar_ref, $ddp) = @_;
21              
22 328         602 my $ret;
23 328 50       999 my $value = ref $scalar_ref ? $$scalar_ref : $scalar_ref;
24              
25 328 100       1344 if (not defined $value) {
    100          
    100          
    100          
26 21         86 $ret = $ddp->maybe_colorize('undef', 'undef');
27             }
28             elsif (HAS_BOOLEAN && _is_bool($value)) {
29 2 100       8 if ($value) {
30 1         6 $ret = $ddp->maybe_colorize('true', 'true');
31             } else {
32 1         5 $ret = $ddp->maybe_colorize('false', 'false');
33             }
34             }
35             elsif ( $ddp->show_dualvar ne 'off' ) {
36 295         528 my $numified;
37 35 50   35   263 $numified = do { no warnings 'numeric'; 0+ $value } if defined $value;
  35         70  
  35         34763  
  295         818  
  295         998  
38 295 100 66     1106 if ( $numified ) {
    100          
39 220 100 100     1063 if ( "$numified" eq $value
      100        
      100        
40             || (
41             # lax mode allows decimal zeroes
42             $ddp->show_dualvar eq 'lax'
43             && ((index("$numified",'.') != -1 && $value =~ /\A\s*${numified}[0]*\s*\z/)
44             || (index("$numified",'.') == -1 && $value =~ /\A\s*$numified(?:\.[0]*)?\s*\z/))
45             )
46             ) {
47 208         963 $value =~ s/\A\s+//;
48 208         679 $value =~ s/\s+\z//;
49 208         666 $ret = $ddp->maybe_colorize($value, 'number');
50             }
51             else {
52 12         81 $ret = Data::Printer::Common::_process_string( $ddp, "$value", 'string' );
53 12         54 $ret = _quoteme($ddp, $ret);
54 12         47 $ret .= ' (dualvar: ' . $ddp->maybe_colorize( $numified, 'number' ) . ')';
55             }
56             }
57             elsif ( !$numified && _is_number($value) ) {
58 9         48 $ret = $ddp->maybe_colorize($value, 'number');
59             }
60             else {
61 66         288 $ret = Data::Printer::Common::_process_string($ddp, $value, 'string');
62 66         315 $ret = _quoteme($ddp, $ret);
63             }
64             }
65             elsif (_is_number($value)) {
66 6         22 $ret = $ddp->maybe_colorize($value, 'number');
67             }
68             else {
69 4         15 $ret = Data::Printer::Common::_process_string($ddp, $value, 'string');
70 4         16 $ret = _quoteme($ddp, $ret);
71             }
72 328         1002 $ret .= _check_tainted($ddp, $scalar_ref);
73 328         860 $ret .= _check_unicode($ddp, $scalar_ref);
74              
75 328 100 100     929 if ($ddp->show_tied and my $tie = ref tied $$scalar_ref) {
76 1         3 $ret .= " (tied to $tie)";
77             }
78              
79 328         1539 return $ret;
80             };
81              
82             #######################################
83             ### Private auxiliary helpers below ###
84             #######################################
85             sub _quoteme {
86 82     82   249 my ($ddp, $text) = @_;
87              
88 82         328 my $scalar_quotes = $ddp->scalar_quotes;
89 82 50       249 if (defined $scalar_quotes) {
90             # foo'bar ==> 'foo\'bar'
91 82 50       285 $text =~ s{$scalar_quotes}{\\$scalar_quotes}g if index($text, $scalar_quotes) >= 0;
92 82         302 my $quote = $ddp->maybe_colorize( $scalar_quotes, 'quotes' );
93 82         285 $text = $quote . $text . $quote;
94             }
95 82         267 return $text;
96             }
97              
98             sub _check_tainted {
99 328     328   761 my ($self, $var) = @_;
100 328 100 100     898 return ' (TAINTED)' if $self->show_tainted && Scalar::Util::tainted($$var);
101 325         994 return '';
102             }
103              
104             sub _check_unicode {
105 328     328   699 my ($self, $var) = @_;
106 328 100 100     959 return ' (U)' if $self->show_unicode && utf8::is_utf8($$var);
107 327         748 return '';
108             }
109              
110             sub _is_number {
111 85     85   333 my ($maybe_a_number) = @_;
112              
113             # Scalar values that start with a zero are strings, NOT numbers.
114             # You can write `my $foo = 0123`, but then `$foo` will be 83,
115             # (numbers starting with zero are octal integers)
116 85 50       361 return if $maybe_a_number =~ /^-?0[0-9]/;
117              
118 85         509 my $is_number = $maybe_a_number =~ m/
119             ^
120             -? # numbers may begin with a '-' sign, but can't with a '+'.
121             # If they do they are not numbers, but strings.
122              
123             [0-9]+ # then there should be some numbers
124              
125             ( \. [0-9]+ )? # there can be decimal part, which is optional
126              
127             ( e [+-] [0-9]+ )? # and an also optional exponential notation part
128             \z
129             /x;
130              
131 85         449 return $is_number;
132             }
133              
134             sub _is_bool {
135 35     35   318 no if HAS_BOOLEAN, warnings => 'experimental::builtin';
  35         66  
  35         4710  
136 307     307   1534 return builtin::is_bool($_[0]);
137             }
138              
139              
140             1;