File Coverage

blib/lib/Data/Printer/Filter/ARRAY.pm
Criterion Covered Total %
statement 59 60 98.3
branch 26 28 92.8
condition 10 12 83.3
subroutine 6 6 100.0
pod 0 1 0.0
total 101 107 94.3


line stmt bran cond sub pod time code
1             package Data::Printer::Filter::ARRAY;
2 32     32   192 use strict;
  32         61  
  32         816  
3 32     32   135 use warnings;
  32         55  
  32         678  
4 32     32   152 use Data::Printer::Filter;
  32         66  
  32         166  
5 32     32   174 use Data::Printer::Common;
  32         54  
  32         656  
6 32     32   143 use Scalar::Util ();
  32         53  
  32         16005  
7              
8             filter 'ARRAY' => \&parse;
9              
10              
11             sub parse {
12 51     51 0 109 my ($array_ref, $ddp) = @_;
13              
14 51         83 my $tied = '';
15 51 100 100     139 if ($ddp->show_tied and my $tie = ref tied @$array_ref) {
16 1         4 $tied = " (tied to $tie)";
17             }
18              
19 51 100       160 return $ddp->maybe_colorize('[]', 'brackets') . $tied
20             unless @$array_ref;
21 46 100 100     140 return $ddp->maybe_colorize('[', 'brackets')
22             . $ddp->maybe_colorize('...', 'array')
23             . $ddp->maybe_colorize(']', 'brackets')
24             . $tied
25             if $ddp->max_depth && $ddp->current_depth >= $ddp->max_depth;
26              
27             #Scalar::Util::weaken($array_ref);
28 45         134 my $string = $ddp->maybe_colorize('[', 'brackets');
29              
30 45         193 my @i = Data::Printer::Common::_fetch_indexes_for($array_ref, 'array', $ddp);
31              
32             # when showing array index, we must add the padding for newlines:
33 45         141 my $has_index = $ddp->index;
34 45         75 my $local_padding = 0;
35 45 100       97 if ($has_index) {
36 34         47 my $last_index;
37             # Get the last index shown to add the proper padding.
38             # If the array has 5000 elements but we're showing 4,
39             # the padding must be 3 + length(1), not 3 + length(5000):
40 34         103 for (my $idx = $#i; $idx >= 0; $idx--) {
41 37 100       83 next if ref $i[$idx];
42 33         49 $last_index = $i[$idx];
43 33         49 last;
44             }
45 34 100       69 if (defined $last_index) {
46 33         69 $local_padding = 3 + length($last_index);
47 33         64 $ddp->{_array_padding} += $local_padding;
48             }
49             }
50              
51 45         148 $ddp->indent;
52 45         87 foreach my $idx (@i) {
53 160         341 $string .= $ddp->newline;
54              
55             # $idx is a message to display, not a real index
56 160 100       361 if (ref $idx) {
57 7         15 $string .= $$idx;
58 7         11 next;
59             }
60              
61 153         318 my $original_varname = $ddp->current_name;
62             # if name was "var" it must become "var[0]", "var[1]", etc
63 153 50 33     352 $ddp->current_name(
64             $original_varname
65             . ($ddp->arrows eq 'all' || ($ddp->arrows eq 'first' && $ddp->current_depth == 1) ? '->' : '')
66             . "[$idx]"
67             );
68              
69 153 100       313 if ($has_index) {
70 105         199 substr($string, -$local_padding) = ''; # get rid of local padding
71 105         436 $string .= $ddp->maybe_colorize(
72             sprintf("%-*s", $local_padding, "[$idx]"),
73             'array'
74             );
75             }
76              
77             # scalar references should be re-referenced to gain
78             # a '\' in front of them.
79 153         328 my $ref = ref $array_ref->[$idx];
80 153 100       302 if ($ref) {
81 41 100       136 if ($ref eq 'SCALAR') {
    50          
82 8         19 $string .= $ddp->parse(\$array_ref->[$idx]);
83             }
84             elsif ($ref eq 'REF') {
85 0         0 $string .= $ddp->parse(\$array_ref->[$idx]);
86             }
87             else {
88 33         94 $string .= $ddp->parse($array_ref->[$idx]);
89             }
90             }
91             else {
92             # not a reference, so we don't need to worry about refcounts.
93             # it helps to prevent cases where Perl reuses addresses:
94 112         317 $string .= $ddp->parse(\$array_ref->[$idx], seen_override => 1);
95             }
96              
97             $string .= $ddp->maybe_colorize($ddp->separator, 'separator')
98 153 100 100     275 if $idx < $#{$array_ref} || $ddp->end_separator;
  153         527  
99              
100             # we're finished with "var[x]", turn it back to "var":
101 153         341 $ddp->current_name( $original_varname );
102             }
103 45         168 $ddp->outdent;
104 45 100       111 $ddp->{_array_padding} -= $local_padding if $has_index;
105 45         115 $string .= $ddp->newline;
106 45         137 $string .= $ddp->maybe_colorize(']', 'brackets');
107              
108 45         191 return $string . $tied;
109             };
110              
111             #######################################
112             ### Private auxiliary helpers below ###
113             #######################################
114              
115             1;