File Coverage

blib/lib/Data/Printer/Filter/SCALAR.pm
Criterion Covered Total %
statement 59 59 100.0
branch 23 28 82.1
condition 20 21 95.2
subroutine 10 10 100.0
pod 0 1 0.0
total 112 119 94.1


line stmt bran cond sub pod time code
1             package Data::Printer::Filter::SCALAR;
2 35     35   254 use strict;
  35         74  
  35         1160  
3 35     35   179 use warnings;
  35         91  
  35         1111  
4 35     35   15284 use Data::Printer::Filter;
  35         83  
  35         287  
5 35     35   222 use Scalar::Util;
  35         74  
  35         5889  
6              
7             filter 'SCALAR' => \&parse;
8             filter 'LVALUE' => sub {
9             my ($scalar_ref, $ddp) = @_;
10             my $string = parse($scalar_ref, $ddp);
11             if ($ddp->show_lvalue) {
12             $string .= $ddp->maybe_colorize(' (LVALUE)', 'lvalue');
13             }
14             return $string;
15             };
16              
17             sub parse {
18 319     319 0 596 my ($scalar_ref, $ddp) = @_;
19              
20 319         489 my $ret;
21 319 50       921 my $value = ref $scalar_ref ? $$scalar_ref : $scalar_ref;
22              
23 319 100       1196 if (not defined $value) {
    100          
    100          
24 21         66 $ret = $ddp->maybe_colorize('undef', 'undef');
25             }
26             elsif ( $ddp->show_dualvar ne 'off' ) {
27 288         512 my $numified;
28 35 50   35   254 $numified = do { no warnings 'numeric'; 0+ $value } if defined $value;
  35         86  
  35         25403  
  288         669  
  288         775  
29 288 100 66     825 if ( $numified ) {
    100          
30 219 100 100     916 if ( "$numified" eq $value
      100        
      100        
31             || (
32             # lax mode allows decimal zeroes
33             $ddp->show_dualvar eq 'lax'
34             && ((index("$numified",'.') != -1 && $value =~ /\A\s*${numified}[0]*\s*\z/)
35             || (index("$numified",'.') == -1 && $value =~ /\A\s*$numified(?:\.[0]*)?\s*\z/))
36             )
37             ) {
38 207         715 $value =~ s/\A\s+//;
39 207         510 $value =~ s/\s+\z//;
40 207         564 $ret = $ddp->maybe_colorize($value, 'number');
41             }
42             else {
43 12         56 $ret = Data::Printer::Common::_process_string( $ddp, "$value", 'string' );
44 12         40 $ret = _quoteme($ddp, $ret);
45 12         42 $ret .= ' (dualvar: ' . $ddp->maybe_colorize( $numified, 'number' ) . ')';
46             }
47             }
48             elsif ( !$numified && _is_number($value) ) {
49 8         29 $ret = $ddp->maybe_colorize($value, 'number');
50             }
51             else {
52 61         284 $ret = Data::Printer::Common::_process_string($ddp, $value, 'string');
53 61         201 $ret = _quoteme($ddp, $ret);
54             }
55             }
56             elsif (_is_number($value)) {
57 6         24 $ret = $ddp->maybe_colorize($value, 'number');
58             }
59             else {
60 4         18 $ret = Data::Printer::Common::_process_string($ddp, $value, 'string');
61 4         13 $ret = _quoteme($ddp, $ret);
62             }
63 319         813 $ret .= _check_tainted($ddp, $scalar_ref);
64 319         720 $ret .= _check_unicode($ddp, $scalar_ref);
65              
66 319 100 100     749 if ($ddp->show_tied and my $tie = ref tied $$scalar_ref) {
67 1         9 $ret .= " (tied to $tie)";
68             }
69              
70 319         1249 return $ret;
71             };
72              
73             #######################################
74             ### Private auxiliary helpers below ###
75             #######################################
76             sub _quoteme {
77 77     77   209 my ($ddp, $text) = @_;
78              
79 77         226 my $scalar_quotes = $ddp->scalar_quotes;
80 77 50       225 if (defined $scalar_quotes) {
81             # foo'bar ==> 'foo\'bar'
82 77 50       283 $text =~ s{$scalar_quotes}{\\$scalar_quotes}g if index($text, $scalar_quotes) >= 0;
83 77         214 my $quote = $ddp->maybe_colorize( $scalar_quotes, 'quotes' );
84 77         286 $text = $quote . $text . $quote;
85             }
86 77         218 return $text;
87             }
88              
89             sub _check_tainted {
90 319     319   681 my ($self, $var) = @_;
91 319 100 100     752 return ' (TAINTED)' if $self->show_tainted && Scalar::Util::tainted($$var);
92 316         874 return '';
93             }
94              
95             sub _check_unicode {
96 319     319   622 my ($self, $var) = @_;
97 319 100 100     752 return ' (U)' if $self->show_unicode && utf8::is_utf8($$var);
98 318         691 return '';
99             }
100              
101             sub _is_number {
102 79     79   194 my ($maybe_a_number) = @_;
103              
104             # Scalar values that start with a zero are strings, NOT numbers.
105             # You can write `my $foo = 0123`, but then `$foo` will be 83,
106             # (numbers starting with zero are octal integers)
107 79 50       355 return if $maybe_a_number =~ /^-?0[0-9]/;
108              
109 79         423 my $is_number = $maybe_a_number =~ m/
110             ^
111             -? # numbers may begin with a '-' sign, but can't with a '+'.
112             # If they do they are not numbers, but strings.
113              
114             [0-9]+ # then there should be some numbers
115              
116             ( \. [0-9]+ )? # there can be decimal part, which is optional
117              
118             ( e [+-] [0-9]+ )? # and an also optional exponential notation part
119             \z
120             /x;
121              
122 79         344 return $is_number;
123             }
124              
125             1;