Commit | Line | Data |
6d2a9a35 |
1 | package Data::Dumper::Concise; |
2 | |
3 | use 5.006; |
4 | |
452e7ff2 |
5 | $VERSION = '2.012'; |
6d2a9a35 |
6 | |
7 | require Exporter; |
8 | require Data::Dumper; |
9 | |
10 | BEGIN { @ISA = qw(Exporter) } |
11 | |
92264889 |
12 | @EXPORT = qw(Dumper DumperF); |
6d2a9a35 |
13 | |
6d2a9a35 |
14 | sub Dumper { |
6d2a9a35 |
15 | my $dd = Data::Dumper->new([]); |
16 | $dd->Terse(1)->Indent(1)->Useqq(1)->Deparse(1)->Quotekeys(0)->Sortkeys(1); |
e946236e |
17 | return $dd->Values([ @_ ])->Dump; |
6d2a9a35 |
18 | } |
19 | |
92264889 |
20 | sub DumperF (&@) { |
21 | my $code = shift; |
22 | return $code->(map Dumper($_), @_); |
23 | } |
24 | |
6d2a9a35 |
25 | =head1 NAME |
26 | |
27 | Data::Dumper::Concise - Less indentation and newlines plus sub deparsing |
28 | |
29 | =head1 SYNOPSIS |
30 | |
31 | use Data::Dumper::Concise; |
32 | |
33 | warn Dumper($var); |
34 | |
35 | is equivalent to: |
36 | |
37 | use Data::Dumper; |
38 | { |
39 | local $Data::Dumper::Terse = 1; |
40 | local $Data::Dumper::Indent = 1; |
41 | local $Data::Dumper::Useqq = 1; |
42 | local $Data::Dumper::Deparse = 1; |
43 | local $Data::Dumper::Quotekeys = 0; |
44 | local $Data::Dumper::Sortkeys = 1; |
45 | warn Dumper($var); |
46 | } |
47 | |
6d2a9a35 |
48 | So for the structure: |
49 | |
50 | { foo => "bar\nbaz", quux => sub { "fleem" } }; |
51 | |
52 | Data::Dumper::Concise will give you: |
53 | |
54 | { |
55 | foo => "bar\nbaz", |
56 | quux => sub { |
57 | use warnings; |
58 | use strict 'refs'; |
59 | 'fleem'; |
60 | } |
61 | } |
62 | |
63 | instead of the default Data::Dumper output: |
64 | |
65 | $VAR1 = { |
9469b5b0 |
66 | 'quux' => sub { "DUMMY" }, |
67 | 'foo' => 'bar |
6d2a9a35 |
68 | baz' |
69 | }; |
70 | |
71 | (note the tab indentation, oh joy ...) |
72 | |
92264889 |
73 | Also try out C<DumperF> which takes a C<CodeRef> as the first argument to |
74 | format the output. For example: |
75 | |
76 | use Data::Dumper::Concise; |
77 | |
78 | warn DumperF { "result: $_[0] result2: $_[1]" } $foo, $bar; |
79 | |
80 | Which is the same as: |
81 | |
82 | warn 'result: ' . Dumper($foo) . ' result2: ' . Dumper($bar); |
83 | |
6d2a9a35 |
84 | =head1 DESCRIPTION |
85 | |
86 | This module always exports a single function, Dumper, which can be called |
39d55feb |
87 | with an array of values to dump those values. |
6d2a9a35 |
88 | |
89 | It exists, fundamentally, as a convenient way to reproduce a set of Dumper |
90 | options that we've found ourselves using across large numbers of applications, |
91 | primarily for debugging output. |
92 | |
73939723 |
93 | The principle guiding theme is "all the concision you can get while still |
94 | having a useful dump and not doing anything cleverer than setting Data::Dumper |
95 | options" - it's been pointed out to us that Data::Dump::Streamer can produce |
96 | shorter output with less lines of code. We know. This is simpler and we've |
97 | never seen it segfault. But for complex/weird structures, it generally rocks. |
98 | You should use it as well, when Concise is underkill. We do. |
99 | |
6d2a9a35 |
100 | Why is deparsing on when the aim is concision? Because you often want to know |
101 | what subroutine refs you have when debugging and because if you were planning |
102 | to eval this back in you probably wanted to remove subrefs first and add them |
103 | back in a custom way anyway. Note that this -does- force using the pure perl |
104 | Dumper rather than the XS one, but I've never in my life seen Data::Dumper |
105 | show up in a profile so "who cares?". |
106 | |
73939723 |
107 | =head1 BUT BUT BUT ... |
108 | |
109 | Yes, we know. Consider this module in the ::Tiny spirit and feel free to |
110 | write a Data::Dumper::Concise::ButWithExtraTwiddlyBits if it makes you |
111 | happy. Then tell us so we can add it to the see also section. |
112 | |
42f8d5be |
113 | =head1 SUGARY SYNTAX |
114 | |
115 | This package also provides: |
116 | |
117 | L<Data::Dumper::Concise::Sugar> - provides Dwarn and DwarnS convenience functions |
118 | |
119 | L<Devel::Dwarn> - shorter form for Data::Dumper::Concise::Sugar |
120 | |
73939723 |
121 | =head1 SEE ALSO |
122 | |
123 | We use for some purposes, and dearly love, the following alternatives: |
124 | |
125 | L<Data::Dump> - prettiness oriented but not amazingly configurable |
126 | |
127 | L<Data::Dump::Streamer> - brilliant. beautiful. insane. extensive. excessive. try it. |
128 | |
129 | L<JSON::XS> - no, really. If it's just plain data, JSON is a great option. |
130 | |
6d2a9a35 |
131 | =head1 AUTHOR |
132 | |
42f8d5be |
133 | mst - Matt S. Trout <mst@shadowcat.co.uk> |
6d2a9a35 |
134 | |
135 | =head1 CONTRIBUTORS |
136 | |
42f8d5be |
137 | frew - Arthur Axel "fREW" Schmidt <frioux@gmail.com> |
6d2a9a35 |
138 | |
139 | =head1 COPYRIGHT |
140 | |
39d55feb |
141 | Copyright (c) 2010 the Data::Dumper::Concise L</AUTHOR> and L</CONTRIBUTORS> |
6d2a9a35 |
142 | as listed above. |
143 | |
144 | =head1 LICENSE |
145 | |
146 | This library is free software and may be distributed under the same terms |
147 | as perl itself. |
148 | |
149 | =cut |
150 | |
151 | 1; |