File Coverage

blib/lib/Data/Dumper.pm
Criterion Covered Total %
statement 336 348 96.5
branch 234 262 89.3
condition 95 109 87.1
subroutine 42 44 95.4
pod 7 30 23.3
total 714 793 90.0


line stmt bran cond sub pod time code
1             #
2             # Data/Dumper.pm
3             #
4             # convert perl data structures into perl syntax suitable for both printing
5             # and eval
6             #
7             # Documentation at the __END__
8             #
9              
10             package Data::Dumper;
11              
12 27     27   619823 use strict;
  27         214  
  27         1306  
13 26     26   176 use warnings;
  26         47  
  26         698  
14              
15             #$| = 1;
16              
17 26     26   659 use 5.008_001;
  26         83  
18             require Exporter;
19              
20 26     26   197 use constant IS_PRE_516_PERL => $] < 5.016;
  26         60  
  26         3047  
21              
22 26     26   172 use Carp ();
  26         51  
  26         6409  
23              
24             # Globals people alter.
25             our ( $Indent, $Trailingcomma, $Purity, $Pad, $Varname, $Useqq, $Terse, $Freezer,
26             $Toaster, $Deepcopy, $Quotekeys, $Bless, $Maxdepth, $Pair, $Sortkeys,
27             $Deparse, $Sparseseen, $Maxrecurse, $Useperl );
28              
29             our ( @ISA, @EXPORT, @EXPORT_OK, $VERSION );
30              
31             BEGIN {
32 26     26   99 $VERSION = '2.182_50'; # Don't forget to set version and release
33             # date in POD below!
34              
35 26         483 @ISA = qw(Exporter);
36 26         113 @EXPORT = qw(Dumper);
37 26         54 @EXPORT_OK = qw(DumperX);
38              
39             # if run under miniperl, or otherwise lacking dynamic loading,
40             # XSLoader should be attempted to load, or the pure perl flag
41             # toggled on load failure.
42 26 50       53 eval {
43 26         152 require XSLoader;
44 26         13177 XSLoader::load( 'Data::Dumper' );
45 26         36731 1
46             }
47             or $Useperl = 1;
48             }
49              
50             my $IS_ASCII = ord 'A' == 65;
51              
52             # module vars and their defaults
53             $Indent = 2 unless defined $Indent;
54             $Trailingcomma = 0 unless defined $Trailingcomma;
55             $Purity = 0 unless defined $Purity;
56             $Pad = "" unless defined $Pad;
57             $Varname = "VAR" unless defined $Varname;
58             $Useqq = 0 unless defined $Useqq;
59             $Terse = 0 unless defined $Terse;
60             $Freezer = "" unless defined $Freezer;
61             $Toaster = "" unless defined $Toaster;
62             $Deepcopy = 0 unless defined $Deepcopy;
63             $Quotekeys = 1 unless defined $Quotekeys;
64             $Bless = "bless" unless defined $Bless;
65             #$Expdepth = 0 unless defined $Expdepth;
66             $Maxdepth = 0 unless defined $Maxdepth;
67             $Pair = ' => ' unless defined $Pair;
68             $Useperl = 0 unless defined $Useperl;
69             $Sortkeys = 0 unless defined $Sortkeys;
70             $Deparse = 0 unless defined $Deparse;
71             $Sparseseen = 0 unless defined $Sparseseen;
72             $Maxrecurse = 1000 unless defined $Maxrecurse;
73              
74             #
75             # expects an arrayref of values to be dumped.
76             # can optionally pass an arrayref of names for the values.
77             # names must have leading $ sign stripped. begin the name with *
78             # to cause output of arrays and hashes rather than refs.
79             #
80             sub new {
81 633     633 1 286890 my($c, $v, $n) = @_;
82              
83 633 100 100     3758 Carp::croak("Usage: PACKAGE->new(ARRAYREF, [ARRAYREF])")
84             unless (defined($v) && (ref($v) eq 'ARRAY'));
85 631 100 100     1905 $n = [] unless (defined($n) && (ref($n) eq 'ARRAY'));
86              
87 631         7953 my($s) = {
88             level => 0, # current recursive depth
89             indent => $Indent, # various styles of indenting
90             trailingcomma => $Trailingcomma, # whether to add comma after last elem
91             pad => $Pad, # all lines prefixed by this string
92             xpad => "", # padding-per-level
93             apad => "", # added padding for hash keys n such
94             sep => "", # list separator
95             pair => $Pair, # hash key/value separator: defaults to ' => '
96             seen => {}, # local (nested) refs (id => [name, val])
97             todump => $v, # values to dump []
98             names => $n, # optional names for values []
99             varname => $Varname, # prefix to use for tagging nameless ones
100             purity => $Purity, # degree to which output is evalable
101             useqq => $Useqq, # use "" for strings (backslashitis ensues)
102             terse => $Terse, # avoid name output (where feasible)
103             freezer => $Freezer, # name of Freezer method for objects
104             toaster => $Toaster, # name of method to revive objects
105             deepcopy => $Deepcopy, # do not cross-ref, except to stop recursion
106             quotekeys => $Quotekeys, # quote hash keys
107             'bless' => $Bless, # keyword to use for "bless"
108             # expdepth => $Expdepth, # cutoff depth for explicit dumping
109             maxdepth => $Maxdepth, # depth beyond which we give up
110             maxrecurse => $Maxrecurse, # depth beyond which we abort
111             useperl => $Useperl, # use the pure Perl implementation
112             sortkeys => $Sortkeys, # flag or filter for sorting hash keys
113             deparse => $Deparse, # use B::Deparse for coderefs
114             noseen => $Sparseseen, # do not populate the seen hash unless necessary
115             };
116              
117 631 100       1614 if ($Indent > 0) {
118 593         992 $s->{xpad} = " ";
119 593         883 $s->{sep} = "\n";
120             }
121 631         10579 return bless($s, $c);
122             }
123              
124             # Packed numeric addresses take less memory. Plus pack is faster than sprintf
125              
126             sub format_refaddr {
127 2005     2005 0 6482 require Scalar::Util;
128 2005         6062 pack "J", Scalar::Util::refaddr(shift);
129             };
130              
131             #
132             # add-to or query the table of already seen references
133             #
134             sub Seen {
135 26     26 1 97 my($s, $g) = @_;
136 26 100 100     114 if (defined($g) && (ref($g) eq 'HASH')) {
137 24         40 my($k, $v, $id);
138 24         91 while (($k, $v) = each %$g) {
139 24 100       47 if (defined $v) {
140 23 100       46 if (ref $v) {
141 22         35 $id = format_refaddr($v);
142 22 100       100 if ($k =~ /^[*](.*)$/) {
    100          
143 16 100       76 $k = (ref $v eq 'ARRAY') ? ( "\\\@" . $1 ) :
    100          
    100          
144             (ref $v eq 'HASH') ? ( "\\\%" . $1 ) :
145             (ref $v eq 'CODE') ? ( "\\\&" . $1 ) :
146             ( "\$" . $1 ) ;
147             }
148             elsif ($k !~ /^\$/) {
149 5         12 $k = "\$" . $k;
150             }
151 22         142 $s->{seen}{$id} = [$k, $v];
152             }
153             else {
154 1         185 Carp::carp("Only refs supported, ignoring non-ref item \$$k");
155             }
156             }
157             else {
158 1         72 Carp::carp("Value of ref must be defined; ignoring undefined item \$$k");
159             }
160             }
161 24         407 return $s;
162             }
163             else {
164 2         3 return map { @$_ } values %{$s->{seen}};
  0         0  
  2         13  
165             }
166             }
167              
168             #
169             # set or query the values to be dumped
170             #
171             sub Values {
172 6     6 1 650 my($s, $v) = @_;
173 6 100       15 if (defined($v)) {
174 2 100       6 if (ref($v) eq 'ARRAY') {
175 1         3 $s->{todump} = [@$v]; # make a copy
176 1         3 return $s;
177             }
178             else {
179 1         157 Carp::croak("Argument to Values, if provided, must be array ref");
180             }
181             }
182             else {
183 4         5 return @{$s->{todump}};
  4         26  
184             }
185             }
186              
187             #
188             # set or query the names of the values to be dumped
189             #
190             sub Names {
191 5     5 1 902 my($s, $n) = @_;
192 5 100       14 if (defined($n)) {
193 4 100       14 if (ref($n) eq 'ARRAY') {
194 3         11 $s->{names} = [@$n]; # make a copy
195 3         20 return $s;
196             }
197             else {
198 1         219 Carp::croak("Argument to Names, if provided, must be array ref");
199             }
200             }
201             else {
202 1         1 return @{$s->{names}};
  1         11  
203             }
204             }
205              
206       0     sub DESTROY {}
207              
208             sub Dump {
209             return &Dumpxs
210             unless $Data::Dumper::Useperl || (ref($_[0]) && $_[0]->{useperl})
211             # Use pure perl version on earlier releases on EBCDIC platforms
212 461 50 100 461 1 80047 || (! $IS_ASCII && $] lt 5.021_010);
  2   100 2   17  
  2   33     4  
  2   66     2305  
213 285         548 return &Dumpperl;
214             }
215              
216             #
217             # dump the refs in the current dumper object.
218             # expects same args as new() if called via package name.
219             #
220             our @post;
221             sub Dumpperl {
222 285     285 0 547 my($s) = shift;
223 285         473 my(@out, $val, $name);
224 285         414 my($i) = 0;
225 285         519 local(@post);
226              
227 285 100       798 $s = $s->new(@_) unless ref $s;
228              
229 285         433 for $val (@{$s->{todump}}) {
  285         710  
230 977         1418 @post = ();
231 977         1778 $name = $s->{names}[$i++];
232 977         1854 $name = $s->_refine_name($name, $val, $i);
233              
234 977         1425 my $valstr;
235             {
236 977         1234 local($s->{apad}) = $s->{apad};
  977         2023  
237 977 100 100     2554 $s->{apad} .= ' ' x (length($name) + 3) if $s->{indent} >= 2 and !$s->{terse};
238 977         1892 $valstr = $s->_dump($val, $name);
239             }
240              
241 972 100 100     4136 $valstr = "$name = " . $valstr . ';' if @post or !$s->{terse};
242 972         2231 my $out = $s->_compose_out($valstr, \@post);
243              
244 972         2113 push @out, $out;
245             }
246 280 100       4342 return wantarray ? @out : join('', @out);
247             }
248              
249             # wrap string in single quotes (escaping if needed)
250             sub _quote {
251 1106     1106   1553 my $val = shift;
252 1106         1933 $val =~ s/([\\\'])/\\$1/g;
253 1106         2809 return "'" . $val . "'";
254             }
255              
256             # Old Perls (5.14-) have trouble resetting vstring magic when it is no
257             # longer valid.
258 26   33 26   281 use constant _bad_vsmg => defined &_vstring && (_vstring(~v0)||'') eq "v0";
  26         97  
  26         94876  
259              
260             #
261             # twist, toil and turn;
262             # and recurse, of course.
263             # sometimes sordidly;
264             # and curse if no recourse.
265             #
266             sub _dump {
267 2535     2535   4696 my($s, $val, $name) = @_;
268 2535         3426 my($out, $type, $id, $sname);
269              
270 2535         3610 $type = ref $val;
271 2535         3226 $out = "";
272              
273 2535 100       3759 if ($type) {
274              
275             # Call the freezer method if it's specified and the object has the
276             # method. Trap errors and warn() instead of die()ing, like the XS
277             # implementation.
278 784         1165 my $freezer = $s->{freezer};
279 784 100 100     1505 if ($freezer and UNIVERSAL::can($val, $freezer)) {
280 3         6 eval { $val->$freezer() };
  3         9  
281 3 100       39 warn "WARNING(Freezer method call failed): $@" if $@;
282             }
283              
284 784         3032 require Scalar::Util;
285 784         1629 my $realpack = Scalar::Util::blessed($val);
286 784 100       1520 my $realtype = $realpack ? Scalar::Util::reftype($val) : ref $val;
287 784         1185 $id = format_refaddr($val);
288              
289             # Note: By this point $name is always defined and of non-zero length.
290             # Keep a tab on it so that we do not fall into recursive pit.
291 784 100       1673 if (exists $s->{seen}{$id}) {
292 232 100 100     633 if ($s->{purity} and $s->{level} > 0) {
293 76 100       167 $out = ($realtype eq 'HASH') ? '{}' :
    100          
294             ($realtype eq 'ARRAY') ? '[]' :
295             'do{my $o}' ;
296 76         228 push @post, $name . " = " . $s->{seen}{$id}[0];
297             }
298             else {
299 156         250 $out = $s->{seen}{$id}[0];
300 156 100       431 if ($name =~ /^([\@\%])/) {
301 30         61 my $start = $1;
302 30 100       199 if ($out =~ /^\\$start/) {
303 10         25 $out = substr($out, 1);
304             }
305             else {
306 20         77 $out = $start . '{' . $out . '}';
307             }
308             }
309             }
310 232         734 return $out;
311             }
312             else {
313             # store our name
314 552 100 100     3036 $s->{seen}{$id} = [ (
    100          
315             ($name =~ /^[@%]/)
316             ? ('\\' . $name )
317             : ($realtype eq 'CODE' and $name =~ /^[*](.*)$/)
318             ? ('\\&' . $1 )
319             : $name
320             ), $val ];
321             }
322 552         1000 my $no_bless = 0;
323 552         724 my $is_regex = 0;
324 552 50 100     1250 if ( $realpack and ($] >= 5.009005 ? re::is_regexp($val) : $realpack eq 'Regexp') ) {
    100          
325 54         72 $is_regex = 1;
326 54         95 $no_bless = $realpack eq 'Regexp';
327             }
328              
329             # If purity is not set and maxdepth is set, then check depth:
330             # if we have reached maximum depth, return the string
331             # representation of the thing we are currently examining
332             # at this depth (i.e., 'Foo=ARRAY(0xdeadbeef)').
333 552 100 100     2305 if (!$s->{purity}
      100        
      100        
334             and defined($s->{maxdepth})
335             and $s->{maxdepth} > 0
336             and $s->{level} >= $s->{maxdepth})
337             {
338 9         47 return qq['$val'];
339             }
340              
341             # avoid recursing infinitely [perl #122111]
342 543 100 100     1834 if ($s->{maxrecurse} > 0
343             and $s->{level} >= $s->{maxrecurse}) {
344 4         68 die "Recursion limit of $s->{maxrecurse} exceeded";
345             }
346              
347             # we have a blessed ref
348 539         793 my ($blesspad);
349 539 100 100     1097 if ($realpack and !$no_bless) {
350 14         33 $out = $s->{'bless'} . '( ';
351 14         33 $blesspad = $s->{apad};
352 14 100       42 $s->{apad} .= ' ' if ($s->{indent} >= 2);
353             }
354              
355 539         736 $s->{level}++;
356 539         1204 my $ipad = $s->{xpad} x $s->{level};
357              
358 539 100 100     2769 if ($is_regex) {
    100 100        
    100          
    100          
    100          
    100          
359 54         85 my $pat;
360 54         77 my $flags = "";
361 54 50       112 if (defined(*re::regexp_pattern{CODE})) {
362 54         200 ($pat, $flags) = re::regexp_pattern($val);
363             }
364             else {
365 0         0 $pat = "$val";
366             }
367 54         218 $pat =~ s <
368             (\\.) # anything backslash escaped
369             | (\$)(?![)|]|\z) # any unescaped $, except $| $) and end
370             | / # any unescaped /
371             >
372 67 100       293 {
    100          
373             $1 ? $1
374             : $2 ? '${\q($)}'
375             : '\\/'
376 54         192 }gex;
377             $out .= "qr/$pat/$flags";
378             }
379             elsif ($realtype eq 'SCALAR' || $realtype eq 'REF'
380 78 50       129 || $realtype eq 'VSTRING') {
381 0         0 if ($realpack) {
382             $out .= 'do{\\(my $o = ' . $s->_dump($$val, "\${$name}") . ')}';
383             }
384 78         375 else {
385             $out .= '\\' . $s->_dump($$val, "\${$name}");
386             }
387             }
388 54         220 elsif ($realtype eq 'GLOB') {
389             $out .= '\\' . $s->_dump($$val, "*{$name}");
390             }
391 137         211 elsif ($realtype eq 'ARRAY') {
392 137         209 my($pad, $mname);
393 137 100       344 my($i) = 0;
394 137         320 $out .= ($name =~ /^\@/) ? '(' : '[';
395 137 100       596 $pad = $s->{sep} . $s->{pad} . $s->{apad};
    100          
396             ($name =~ /^\@(.*)$/) ? ($mname = "\$" . $1) :
397             # omit -> if $foo->[0]->{bar}, but not ${$foo->[0]}->{bar}
398             ($name =~ /^\\?[\%\@\*\$][^{].*[]}]$/) ? ($mname = $name) :
399 137 100       330 ($mname = $name . '->');
400 137         287 $mname .= '->' if $mname =~ /^\*.+\{[A-Z]+\}$/;
401 322         702 for my $v (@$val) {
402             $sname = $mname . '[' . $i . ']';
403 322 100       672 $out .= $pad . $ipad . '#' . $i
404 322         976 if $s->{indent} >= 3;
405             $out .= $pad . $ipad . $s->_dump($v, $sname);
406             $out .= ","
407 320 100 100     1327 if $i++ < $#$val
      100        
408             || ($s->{trailingcomma} && $s->{indent} >= 1);
409 135 100       436 }
410 135 100       383 $out .= $pad . ($s->{xpad} x ($s->{level} - 1)) if $i;
411             $out .= ($name =~ /^\@/) ? ')' : ']';
412             }
413 203         364 elsif ($realtype eq 'HASH') {
414 203 100       522 my ($k, $v, $pad, $lpad, $mname, $pair);
415 203         525 $out .= ($name =~ /^\%/) ? '(' : '{';
416 203         332 $pad = $s->{sep} . $s->{pad} . $s->{apad};
417 203         309 $lpad = $s->{apad};
418 203 100       1005 $pair = $s->{pair};
    100          
419             ($name =~ /^\%(.*)$/) ? ($mname = "\$" . $1) :
420             # omit -> if $foo->[0]->{bar}, but not ${$foo->[0]}->{bar}
421             ($name =~ /^\\?[\%\@\*\$][^{].*[]}]$/) ? ($mname = $name) :
422 203 100       492 ($mname = $name . '->');
423 203 100       435 $mname .= '->' if $mname =~ /^\*.+\{[A-Z]+\}$/;
424 203         336 my $sortkeys = defined($s->{sortkeys}) ? $s->{sortkeys} : '';
425 203 100       430 my $keys = [];
426 111 100       209 if ($sortkeys) {
427 11         30 if (ref($s->{sortkeys}) eq 'CODE') {
428 11 100       191 $keys = $s->{sortkeys}($val);
429 1         196 unless (ref($keys) eq 'ARRAY') {
430 1         38 Carp::carp("Sortkeys subroutine did not return ARRAYREF");
431             $keys = [];
432             }
433             }
434 100         442 else {
435             $keys = [ sort keys %$val ];
436             }
437             }
438              
439 203         375 # Ensure hash iterator is reset
440             keys(%$val);
441 203         320  
442 203 100       852 my $key;
    100          
443             while (($k, $v) = ! $sortkeys ? (each %$val) :
444             @$keys ? ($key = shift(@$keys), $val->{$key}) :
445             () )
446 508         1472 {
447             my $nk = $s->_dump($k, "");
448              
449 508 100 100     2674 # _dump doesn't quote numbers of this form
    100 100        
450 6 100       35 if ($s->{quotekeys} && $nk =~ /^(?:0|-?[1-9][0-9]{0,8})\z/) {
451             $nk = $s->{useqq} ? qq("$nk") : qq('$nk');
452             }
453 150         331 elsif (!$s->{quotekeys} and $nk =~ /^[\"\']([A-Za-z_]\w*)[\"\']$/) {
454             $nk = $1
455             }
456 508         1048  
457 508         960 $sname = $mname . '{' . $nk . '}';
458             $out .= $pad . $ipad . $nk . $pair;
459              
460             # temporarily alter apad
461 508 100       1141 $s->{apad} .= (" " x (length($nk) + 4))
462 508         990 if $s->{indent} >= 2;
463             $out .= $s->_dump($val->{$k}, $sname) . ",";
464 505 100       2417 $s->{apad} = $lpad
465             if $s->{indent} >= 2;
466 200 100       525 }
467 194 100 100     554 if (substr($out, -1) eq ',') {
468 194         497 chop $out if !$s->{trailingcomma} || !$s->{indent};
469             $out .= $pad . ($s->{xpad} x ($s->{level} - 1));
470 200 100       607 }
471             $out .= ($name =~ /^\%/) ? ')' : '}';
472             }
473 12 100       36 elsif ($realtype eq 'CODE') {
474 4         18 if ($s->{deparse}) {
475 4         5490 require B::Deparse;
476 4         40 my $sub = 'sub ' . (B::Deparse->new)->coderef2text($val);
477 4         24 my $pad = $s->{sep} . $s->{pad} . $s->{apad} . $s->{xpad} x ($s->{level} - 1);
478 4         11 $sub =~ s/\n/$pad/gs;
479             $out .= $sub;
480             }
481 8         18 else {
482 8 100       281 $out .= 'sub { "DUMMY" }';
483             Carp::carp("Encountered CODE ref, using dummy placeholder") if $s->{purity};
484             }
485             }
486 1         263 else {
487             Carp::croak("Can't handle '$realtype' type");
488             }
489 531 100 100     1341  
490 13         33 if ($realpack and !$no_bless) { # we have a blessed ref
491             $out .= ', ' . _quote($realpack) . ' )';
492 13 50       41 $out .= '->' . $s->{toaster} . '()'
493 13         26 if $s->{toaster} ne '';
494             $s->{apad} = $blesspad;
495 531         883 }
496             $s->{level}--;
497             }
498             else { # simple scalar
499 1751         2454  
500 1751         2345 my $ref = \$_[1];
501             my $v;
502 1751 100       3155 # first, catalog the scalar
503 1199         1826 if ($name ne '') {
504 1199 100       2479 $id = format_refaddr($ref);
505 110 100       263 if (exists $s->{seen}{$id}) {
506 8         13 if ($s->{seen}{$id}[2]) {
507             $out = $s->{seen}{$id}[0];
508 8         27 #warn "[<$out]\n";
509             return "\${$out}";
510             }
511             }
512             else {
513 1089         3378 #warn "[>\\$name]\n";
514             $s->{seen}{$id} = ["\\$name", $ref];
515             }
516 1743         2478 }
517 1743 100 66     13224 $ref = \$val;
    100 100        
    100 0        
    50 33        
    100          
518 74         280 if (ref($ref) eq 'GLOB') { # glob
519 74         288 my $name = substr($val, 1);
520 74 100 100     461 $name =~ s/^main::(?!\z)/::/;
521 30         54 if ($name =~ /\A(?:[A-Z_a-z][0-9A-Z_a-z]*)?::(?:[0-9A-Z_a-z]+::)*[0-9A-Z_a-z]*\z/ && $name ne 'main::') {
522             $sname = $name;
523             }
524 44         110 else {
525 44 100       124 local $s->{useqq} = IS_PRE_516_PERL && ($s->{useqq} || $name =~ /[^\x00-\x7f]/) ? 1 : $s->{useqq};
526             $sname = $s->_dump(
527             $name eq 'main::'
528             ? ''
529             : $name,
530             "",
531 44         115 );
532             $sname = '{' . $sname . '}';
533 74 100       161 }
534 24         33 if ($s->{purity}) {
535 24         58 my $k;
536 24         39 local ($s->{level}) = 0;
537 72         172 for $k (qw(SCALAR ARRAY HASH)) {
538 72 100       160 my $gval = *$val{$k};
539 56 100 100     152 next unless defined $gval;
540             next if $k eq "SCALAR" && ! defined $$gval; # always there
541              
542 44         63 # _dump can push into @post, so we hold our place using $postlen
543 44         133 my $postlen = scalar @post;
544 44 100       102 $post[$postlen] = "\*$sname = ";
545 44         150 local ($s->{apad}) = " " x length($post[$postlen]) if $s->{indent} >= 2;
546             $post[$postlen] .= $s->_dump($gval, "\*$sname\{$k\}");
547             }
548 74         164 }
549             $out .= '*' . $sname;
550             }
551 10         83 elsif (!defined($val)) {
552             $out .= "undef";
553             }
554             # This calls the XSUB _vstring (if the XS code is loaded). I'm not *sure* if
555             # if belongs in the "Pure Perl" implementation. It sort of depends on what
556             # was meant by "Pure Perl", as this subroutine already relies Scalar::Util
557             # loading, which means that it has an XS dependency. De facto, it's the
558             # "Pure Perl" implementation of dumping (which uses XS helper code), as
559             # opposed to the C implementation (which calls out to Perl helper code).
560             # So in that sense this is fine - it just happens to be a local XS helper.
561             elsif (defined &_vstring and $v = _vstring($val)
562 6         14 and !_bad_vsmg || eval $v eq $val) {
563             $out .= $v;
564             }
565             # However the confusion comes here - if we *can't* find our XS helper, we
566             # fall back to this code, which generates different (worse) results. That's
567             # better than nothing, *but* it means that if you run the regression tests
568             # with Dumper.so missing, the test for "vstrings" fails, because this code
569             # here generates a different result. So there are actually "three" different
570             # implementations of Data::Dumper (kind of sort of) but we only test two.
571             elsif (!defined &_vstring
572 0         0 and ref $ref eq 'VSTRING' || eval{Scalar::Util::isvstring($val)}) {
573             $out .= sprintf "v%vd", $val;
574             }
575             # \d here would treat "1\x{660}" as a safe decimal number
576 458         989 elsif ($val =~ /^(?:0|-?[1-9][0-9]{0,8})\z/) { # safe decimal number
577             $out .= $val;
578             }
579 1195 100 100     4352 else { # string
580             if ($s->{useqq} or $val =~ tr/\0-\377//c) {
581 102         238 # Fall back to qq if there's Unicode
582             $out .= qquote($val, $s->{useqq});
583             }
584 1093         1883 else {
585             $out .= _quote($val);
586             }
587             }
588 2274 100       4392 }
589             if ($id) {
590             # if we made it this far, $id was added to seen list at current
591 1722 100       3514 # level, so remove it to get deep copies
    50          
592 26         48 if ($s->{deepcopy}) {
593             delete($s->{seen}{$id});
594             }
595 1696         3188 elsif ($name) {
596             $s->{seen}{$id}[2] = 1;
597             }
598 2274         5232 }
599             return $out;
600             }
601              
602             #
603             # non-OO style of earlier version
604             #
605 85     85 1 76982 sub Dumper {
606             return Data::Dumper->Dump([@_]);
607             }
608              
609             # compat stub
610 16     16 0 9214 sub DumperX {
611             return Data::Dumper->Dumpxs([@_], []);
612             }
613              
614             #
615             # reset the "seen" cache
616             #
617 12     12 1 9685 sub Reset {
618 12         62 my($s) = shift;
619 12         159 $s->{seen} = {};
620             return $s;
621             }
622              
623 33     33 0 796 sub Indent {
624 33 100       69 my($s, $v) = @_;
625 32 100       58 if (@_ >= 2) {
626 9         14 if ($v == 0) {
627 9         13 $s->{xpad} = "";
628             $s->{sep} = "";
629             }
630 23         34 else {
631 23         29 $s->{xpad} = " ";
632             $s->{sep} = "\n";
633 32         46 }
634 32         56 $s->{indent} = $v;
635             return $s;
636             }
637 1         3 else {
638             return $s->{indent};
639             }
640             }
641              
642 28     28 0 88 sub Trailingcomma {
643 28 50       68 my($s, $v) = @_;
644             @_ >= 2 ? (($s->{trailingcomma} = $v), return $s) : $s->{trailingcomma};
645             }
646              
647 3     3 0 9 sub Pair {
648 3 100       17 my($s, $v) = @_;
649             @_ >= 2 ? (($s->{pair} = $v), return $s) : $s->{pair};
650             }
651              
652 2     2 0 11 sub Pad {
653 2 50       9 my($s, $v) = @_;
654             @_ >= 2 ? (($s->{pad} = $v), return $s) : $s->{pad};
655             }
656              
657 2     2 0 12 sub Varname {
658 2 50       10 my($s, $v) = @_;
659             @_ >= 2 ? (($s->{varname} = $v), return $s) : $s->{varname};
660             }
661              
662 28     28 0 74 sub Purity {
663 28 50       622 my($s, $v) = @_;
664             @_ >= 2 ? (($s->{purity} = $v), return $s) : $s->{purity};
665             }
666              
667 6     6 0 32 sub Useqq {
668 6 50       25 my($s, $v) = @_;
669             @_ >= 2 ? (($s->{useqq} = $v), return $s) : $s->{useqq};
670             }
671              
672 9     9 0 28 sub Terse {
673 9 100       36 my($s, $v) = @_;
674             @_ >= 2 ? (($s->{terse} = $v), return $s) : $s->{terse};
675             }
676              
677 6     6 0 35 sub Freezer {
678 6 50       29 my($s, $v) = @_;
679             @_ >= 2 ? (($s->{freezer} = $v), return $s) : $s->{freezer};
680             }
681              
682 6     6 0 25 sub Toaster {
683 6 50       21 my($s, $v) = @_;
684             @_ >= 2 ? (($s->{toaster} = $v), return $s) : $s->{toaster};
685             }
686              
687 8     8 0 45 sub Deepcopy {
688 8 50       149 my($s, $v) = @_;
689             @_ >= 2 ? (($s->{deepcopy} = $v), return $s) : $s->{deepcopy};
690             }
691              
692 7     7 0 28 sub Quotekeys {
693 7 50       18 my($s, $v) = @_;
694             @_ >= 2 ? (($s->{quotekeys} = $v), return $s) : $s->{quotekeys};
695             }
696              
697 6     6 0 42 sub Bless {
698 6 50       22 my($s, $v) = @_;
699             @_ >= 2 ? (($s->{'bless'} = $v), return $s) : $s->{'bless'};
700             }
701              
702 10     10 0 31 sub Maxdepth {
703 10 100       225 my($s, $v) = @_;
704             @_ >= 2 ? (($s->{'maxdepth'} = $v), return $s) : $s->{'maxdepth'};
705             }
706              
707 0     0 0 0 sub Maxrecurse {
708 0 0       0 my($s, $v) = @_;
709             @_ >= 2 ? (($s->{'maxrecurse'} = $v), return $s) : $s->{'maxrecurse'};
710             }
711              
712 3     3 0 16 sub Useperl {
713 3 50       14 my($s, $v) = @_;
714             @_ >= 2 ? (($s->{'useperl'} = $v), return $s) : $s->{'useperl'};
715             }
716              
717 39     39 0 124 sub Sortkeys {
718 39 50       93 my($s, $v) = @_;
719             @_ >= 2 ? (($s->{'sortkeys'} = $v), return $s) : $s->{'sortkeys'};
720             }
721              
722 6     6 0 42 sub Deparse {
723 6 100       24 my($s, $v) = @_;
724             @_ >= 2 ? (($s->{'deparse'} = $v), return $s) : $s->{'deparse'};
725             }
726              
727 6     6 0 23 sub Sparseseen {
728 6 50       15 my($s, $v) = @_;
729             @_ >= 2 ? (($s->{'noseen'} = $v), return $s) : $s->{'noseen'};
730             }
731              
732             # used by qquote below
733             my %esc = (
734             "\a" => "\\a",
735             "\b" => "\\b",
736             "\t" => "\\t",
737             "\n" => "\\n",
738             "\f" => "\\f",
739             "\r" => "\\r",
740             "\e" => "\\e",
741             );
742              
743             my $low_controls = ($IS_ASCII)
744              
745             # This includes \177, because traditionally it has been
746             # output as octal, even though it isn't really a "low"
747             # control
748             ? qr/[\0-\x1f\177]/
749              
750             # EBCDIC low controls.
751             : qr/[\0-\x3f]/;
752              
753             # put a string value in double quotes
754 102     102 0 197 sub qquote {
755 102         363 local($_) = shift;
756             s/([\\\"\@\$])/\\$1/g;
757              
758             # This efficiently changes the high ordinal characters to \x{} if the utf8
759             # flag is on. On ASCII platforms, the high ordinals are all the
760             # non-ASCII's. On EBCDIC platforms, we don't include in these the non-ASCII
761             # controls whose ordinals are less than SPACE, excluded below by the range
762             # \0-\x3f. On ASCII platforms this range just compiles as part of :ascii:.
763             # On EBCDIC platforms, there is just one outlier high ordinal control, and
764 26     26   20123 # it gets output as \x{}.
  26         433  
  26         145  
  102         135  
  102         122  
  102         148  
765 314         1026 my $bytes; { use bytes; $bytes = length }
766 102 100 33     458 s/([^[:ascii:]\0-\x3f])/sprintf("\\x{%x}",ord($1))/ge
      66        
767             if $bytes > length
768              
769             # The above doesn't get the EBCDIC outlier high ordinal control when
770             # the string is UTF-8 but there are no UTF-8 variant characters in it.
771             # We want that to come out as \x{} anyway. We need is_utf8() to do
772             # this.
773             || (! $IS_ASCII && utf8::is_utf8($_));
774 102 100       518  
775             return qq("$_") unless /[[:^print:]]/; # fast exit if only printables
776              
777             # Here, there is at least one non-printable to output. First, translate the
778 33         152 # escapes.
779             s/([\a\b\t\n\f\r\e])/$esc{$1}/g;
780              
781 33         246 # no need for 3 digits in escape for octals not followed by a digit.
  119         400  
782             s/($low_controls)(?!\d)/'\\'.sprintf('%o',ord($1))/eg;
783              
784 33         158 # But otherwise use 3 digits
  4         26  
785             s/($low_controls)/'\\'.sprintf('%03o',ord($1))/eg;
786              
787 33   100     87 # all but last branch below not supported --BEHAVIOR SUBJECT TO CHANGE--
788 33 50       100 my $high = shift || "";
    50          
    50          
789 0 0       0 if ($high eq "iso8859") { # Doesn't escape the Latin1 printables
790 0         0 if ($IS_ASCII) {
  0         0  
791             s/([\200-\240])/'\\'.sprintf('%o',ord($1))/eg;
792             }
793 0         0 else {
794 0         0 my $high_control = utf8::unicode_to_native(0x9F);
  0         0  
795             s/$high_control/sprintf('\\%o',ord($1))/eg;
796             }
797             } elsif ($high eq "utf8") {
798             # Some discussion of what to do here is in
799             # https://rt.perl.org/Ticket/Display.html?id=113088
800             # use utf8;
801             # $str =~ s/([^\040-\176])/sprintf "\\x{%04x}", ord($1)/ge;
802             } elsif ($high eq "8bit") {
803             # leave it as it is
804 33         103 } else {
  264         669  
805             s/([[:^ascii:]])/'\\'.sprintf('%03o',ord($1))/eg;
806             #s/([^\040-\176])/sprintf "\\x{%04x}", ord($1)/ge;
807             }
808 33         160  
809             return qq("$_");
810             }
811              
812 977     977   1314 sub _refine_name {
813 977         1834 my $s = shift;
814 977 100       1733 my ($name, $val, $i) = @_;
815 199 100       728 if (defined $name) {
    100          
816 77 100       150 if ($name =~ /^[*](.*)$/) {
817 76 100       319 if (defined $val) {
    100          
    100          
818             $name = (ref $val eq 'ARRAY') ? ( "\@" . $1 ) :
819             (ref $val eq 'HASH') ? ( "\%" . $1 ) :
820             (ref $val eq 'CODE') ? ( "\*" . $1 ) :
821             ( "\$" . $1 ) ;
822             }
823 1         4 else {
824             $name = "\$" . $1;
825             }
826             }
827 121         236 elsif ($name !~ /^\$/) {
828             $name = "\$" . $name;
829             }
830             }
831 778         1603 else { # no names provided
832             $name = "\$" . $s->{varname} . $i;
833 977         1949 }
834             return $name;
835             }
836              
837 972     972   1337 sub _compose_out {
838 972         1700 my $s = shift;
839 972         1312 my ($valstr, $postref) = @_;
840 972         2201 my $out = "";
841 972 100       1246 $out .= $s->{pad} . $valstr . $s->{sep};
  972         1909  
842             if (@{$postref}) {
843 32         121 $out .= $s->{pad} .
844             join(';' . $s->{sep} . $s->{pad}, @{$postref}) .
845 32         69 ';' .
846             $s->{sep};
847 972         1898 }
848             return $out;
849             }
850              
851             1;
852             __END__