8 use vars
qw( $VERSION @ISA @EXPORT );
10 @ISA = qw( DynaLoader Exporter );
11 @EXPORT = qw( DDumper DPeek DDump );
12 $] >= 5.007003 and push @EXPORT, "DDump_IO";
14 bootstrap DDumper
$VERSION;
16 ### ############# DDumper () ##################################################
22 local $Data::Dumper
::Sortkeys
= 1;
23 local $Data::Dumper
::Indent
= 1;
25 my $s = Data
::Dumper
::Dumper
@_;
26 $s =~ s!^(\s*)'([^']*)'\s*=>!sprintf "%s%-16s =>", $1, $2!gme; # Align => '
27 $s =~ s!^(?= *[]}](?:[;,]|$))! !gm;
28 $s =~ s!^(\s+)!$1$1!gm;
30 defined wantarray or print STDERR
$s;
34 ### ############# DDump () ####################################################
40 $has_perlio = ($Config{useperlio
} || "undef") eq "define";
45 my ($var, $down) = (@_, 0);
48 if ($ref eq "SCALAR" || $ref eq "REF") {
49 my %hash = DDump
($$var, $down);
52 if ($ref eq "ARRAY") {
54 foreach my $list (@
$var) {
55 my %hash = DDump
($list, $down);
56 push @list, { %hash };
62 foreach my $key (sort keys %$var) {
63 $hash{DPeek
($key)} = { DDump
($var->{$key}, $down) };
72 my ($var, $down, $dump, $fh) = (@_, "");
74 if ($has_perlio and open $fh, ">", \
$dump) {
75 #print STDERR "Using DDump_IO\n";
76 DDump_IO
($fh, $var, $down);
80 #print STDERR "Using DDump_XS\n";
81 $dump = DDump_XS
($var);
89 my ($var, $down) = (@_, 0);
90 my @dump = split "\n", _DDump
($var, wantarray || $down) or return;
94 ($hash{sv
} = $dump[0]) =~ s/^SV\s*=\s*//;
95 m/^\s+(\w+)\s*=\s*(.*)/ and $hash{$1} = $2 for @dump;
97 if (exists $hash{FLAGS
}) {
98 $hash{FLAGS
} =~ tr/()//d;
99 $hash{FLAGS
} = { map { $_ => 1 } split m/,/ => $hash{FLAGS
} };
102 $down && ref $var and
103 $hash{RV
} = _DDump_ref
($var, $down - 1) || $var;
107 my $dump = join "\n", @dump, "";
109 defined wantarray and return $dump;
120 DDumper - Modified and extended debugging facilities
126 print DDumper \%hash; # Same syntax as Data::Dumper
130 my $dump = DDump $var;
131 my %hash = DDump \@list;
134 my %hash = DDump (\%hash, 5); # dig 5 levels deep
137 open my $fh, ">", \$dump;
138 DDump_IO ($fh, \%hash, 6);
144 =head2 DDumper ($var, ...)
146 Not liking the default output of Data::Dumper, and always feeling the need
147 to set C<$Data::Dumper::Sortkeys = 1;>, and not liking any of the default
148 layouts, this function is just a wrapper around Data::Dumper::Dumper with
149 everything set as I like it.
151 $Data::Dumper::Sortkeys = 1;
152 $Data::Dumper::Indent = 1;
154 And the result is further beautified to meet my needs:
156 * quotation of hash keys has been removed
157 * arrows for hashes are aligned at 16 (longer keys don't align)
158 * closing braces and brackets are now correctly aligned
160 In void context, C<DDumper ()> prints to STDERR.
164 print DDumper { ape => 1, foo => "egg", bar => [ 2, "baz", undef ]};
178 Playing with C<sv_dump ()>, I found C<Perl_sv_peek ()>, and it might be
179 very useful for simple checks.
183 print DPeek "abc\x{0a}de\x{20ac}fg";
185 PV("abc\nde\342\202\254fg"\0) [UTF8 "abc\nde\x{20ac}fg"]
187 =head3 DDump ($var [, $dig_level])
189 A very useful module when debugging is C<Devel::Peek>, but is has one big
190 disadvantage: it only prints to STDERR, which is not very handy when your
191 code wants to inspect variables al a low level.
193 Perl itself has C<sv_dump ()>, which does something similar, but still
194 prints to STDERR, and only one level deep.
196 C<DDump ()> is an attempt to make the innards available to the script level
197 with a reasonable level of compatibility. C<DDump ()> is context sensitive.
199 In void context, it behaves exactly like C<Perl_sv_dump ()>.
201 In scalar context, it returns what C<Perl_sv_dump ()> would have printed.
203 In list context, it returns a hash of the variable's properties. In this mode
204 you can pass an optional second argument that detemines the depth of digging.
208 print scalar DDump "abc\x{0a}de\x{20ac}fg"
210 SV = PV(0x723250) at 0x8432b0
212 FLAGS = (PADBUSY,PADMY,POK,pPOK,UTF8)
213 PV = 0x731ac0 "abc\nde\342\202\254fg"\0 [UTF8 "abc\nde\x{20ac}fg"]
217 my %h = DDump "abc\x{0a}de\x{20ac}fg";
230 PV => '0x731ac0 "abc\\nde\\342\\202\\254fg"\\0 [UTF8 "abc\\nde\\x{20ac}fg"]',
232 sv => 'PV(0x723250) at 0x8432c0'
238 bar => [ 2, "baz", undef ],
259 sv => 'IV(0x747020) at 0x843a10'
273 sv => 'PVIV(0x7223e0) at 0x843a10'
285 PV => '0x7496c0 "egg"\\0',
287 sv => 'PVIV(0x7223e0) at 0x843a10'
290 sv => 'RV(0x79d058) at 0x843310'
293 =head2 DDump_IO ($io, $var [, $dig_level])
295 A wrapper function around perl's internal C<Perl_do_sv_dump ()>, which
296 makes C<Devel::Peek> completely superfluous. As PerlIO is only available
297 perl version 5.7.3 and up, this function is not available in older perls.
302 open my $eh, ">", \$dump;
303 DDump_IO ($eh, { 3 => 4, ape => [5..8]}, 6);
307 SV = RV(0x79d9e0) at 0x843f00
311 SV = PVHV(0x79c948) at 0x741090
316 ARRAY = 0x748ff0 (0:7, 2:1)
323 Elt "ape" HASH = 0x97623e03
324 SV = RV(0x79d9d8) at 0x8440e0
328 SV = PVAV(0x7264b0) at 0x741470
339 SV = IV(0x7467c8) at 0x7c1aa0
344 SV = IV(0x7467b0) at 0x8440f0
349 SV = IV(0x746810) at 0x75be00
354 SV = IV(0x746d38) at 0x7799d0
358 Elt "3" HASH = 0xa400c7f3
359 SV = IV(0x746fd0) at 0x7200e0
366 C<DDump ()> uses an XS wrapper around C<Perl_sv_dump ()> where the
367 STDERR is temporarily caught to a pipe. The internal XS helper functions
368 are not meant for user space
370 =head2 DDump_XS (SV *sv)
372 Base interface to internals for C<DDump ()>.
376 Not all types of references are supported.
380 No idea how far back this goes in perl support.
390 H.Merijn Brand <h.m.brand@xs4all.nl>
392 =head1 COPYRIGHT AND LICENSE
394 Copyright (C) 2008-2008 H.Merijn Brand
396 This library is free software; you can redistribute it and/or modify
397 it under the same terms as Perl itself.