1Data::Printer(3) User Contributed Perl Documentation Data::Printer(3)
2
3
4
6 Data::Printer - colored & full-featured pretty print of Perl data
7 structures and objects
8
10 Want to see what's inside a variable in a complete, colored and human-
11 friendly way?
12
13 use DDP; # same as 'use Data::Printer'
14
15 p $some_var;
16 p $some_var, as => "This label will be printed too!";
17
18 # no need to use '\' before arrays or hashes!
19 p @array;
20 p %hash;
21
22 # printing anonymous array references:
23 p [ $one, $two, $three ]->@*; # perl 5.24 or later!
24 p @{[ $one, $two, $three ]}; # same, older perls
25 &p( [ $one, $two, $three ] ); # same, older perls
26
27 # printing anonymous hash references:
28 p { foo => $foo, bar => $bar }->%*; # perl 5.24 or later!
29 p %{{ foo => $foo, bar => $bar }}; # same, older perls
30 &p( { foo => $foo, bar => $bar } ); # same, older perls
31
32 The snippets above will print the contents of the chosen variables to
33 STDERR on your terminal, with colors and a few extra features to help
34 you debug your code.
35
36 If you wish to grab the output and handle it yourself, call np():
37
38 my $dump = np $var;
39
40 die "this is what happened: " . np %data;
41
42 The np() function is the same as p() but will return the string
43 containing the dump. By default it has no colors, but you can change
44 that easily too.
45
46 That's pretty much it :)
47
48 Data::Printer is fully customizable, even on a per-module basis! Once
49 you figure out your own preferences, create a .dataprinter
50 configuration file for yourself (or one for each project) and
51 Data::Printer will automatically use it!
52
54 Here's what Data::Printer offers Perl developers, out of the box:
55
56 • Variable dumps designed for easy parsing by the human brain, not a
57 machine.
58
59 • Highly customizable, from indentation size to depth level. You can
60 even rename the exported p() function!
61
62 • Beautiful (and customizable) colors to highlight variable dumps and
63 make issues stand-out quickly on your console. Comes bundled with
64 several themes for you to pick that work on light and dark terminal
65 backgrounds, and you can create your own as well.
66
67 • Filters for specific data structures and objects to make debugging
68 much, much easier. Includes filters for many popular classes from
69 CPAN like JSON::*, URI, HTTP::*, LWP, Digest::*, DBI and
70 DBIx::Class. printing what really matters to developers debugging
71 code. It also lets you create your own custom filters easily.
72
73 • Lets you inspect information that's otherwise difficult to
74 find/debug in Perl 5, like circular references, reference counting
75 (refcount), weak/read-only information, overloaded operators,
76 tainted data, ties, dual vars, even estimated data size - all to
77 help you spot issues with your data like leaks without having to
78 know a lot about internal data structures or install hardcore tools
79 like Devel::Peek and Devel::Gladiator.
80
81 • Full support for dumping perl 5.38 native classes.
82
83 • keep your custom settings on a .dataprinter file that allows
84 different options per module being analyzed! You can have one
85 ".dataprinter" file per project, or default to one in your home
86 directory. You may also create a custom profile class with your
87 preferences and filters and upload it to CPAN.
88
89 • output to many different targets like files, variables or open
90 handles (defaults to STDERR). You can send your dumps to the screen
91 or anywhere else, and customize this setting on a per-project or
92 even per-module basis, like print everything from Some::Module to a
93 debug.log file with extra info, and everything else to STDERR.
94
95 • Easy to learn, easy to master. Seriously, the synopsis above and
96 the customization section below cover about 90% of all use cases.
97
98 • Works on Perl 5.8 and later. Because you can't control where you
99 debug, we try our best to be compatible with all versions of Perl
100 5, from the oldest available to the bleeding edge.
101
102 • Best of all? All that with No non-core dependencies, Zero. Nada. So
103 don't worry about adding extra weight to your project, as
104 Data::Printer can be easily added/removed.
105
107 The ever-popular Data::Dumper is a fantastic tool, meant to stringify
108 data structures in a way they are suitable for being "eval"'ed back in.
109 The thing is, a lot of people keep using it (and similar ones, like
110 Data::Dump) to print data structures and objects on screen for
111 inspection and debugging, and while you can use those modules for that,
112 it doesn't mean you should.
113
114 This is where Data::Printer comes in. It is meant to do one thing and
115 one thing only:
116
117 format Perl variables and objects to be inspected by a human
118
119 If you want to serialize/store/restore Perl data structures, this
120 module will NOT help you. Try Storable, Data::Dumper, JSON, or
121 whatever. CPAN is full of such solutions!
122
123 Whenever you type "use Data::Printer" or "use DDP", we export two
124 functions to your namespace:
125
126 p()
127 This function pretty-prints the contents of whatever variable to STDERR
128 (by default), and will use colors by default if your terminal supports
129 it.
130
131 p @some_array;
132 p %some_hash;
133 p $scalar_or_ref;
134
135 Note that anonymous structures will only work if you postderef them:
136
137 p [$foo, $bar, $baz]->@*;
138
139 you may also deref it manually:
140
141 p %{{ foo => $foo }};
142
143 or prefix p() with "&":
144
145 &p( [$foo, $bar, $baz] ); # & (note mandatory parenthesis)
146
147 You can pass custom options that will work only on that particular
148 call:
149
150 p @var, as => "some label", colorized => 0;
151 p %var, show_memsize => 1;
152
153 By default, p() prints to STDERR and returns the same variable being
154 dumped. This lets you quickly wrap variables with p() without worrying
155 about changing return values. It means that if you change this:
156
157 sub foo { my $x = shift + 13; $x }
158
159 to this:
160
161 sub foo { my $x = shift + 13; p($x) }
162
163 The function will still return $x after printing the contents. This
164 form of handling data even allows method chaining, so if you want to
165 inspect what's going on in the middle of this:
166
167 $object->foo->bar->baz;
168
169 You can just add "DDP::p" anywhere:
170
171 $object->foo->DDP::p->bar->baz; # what happens to $object after ->foo?
172
173 Check out the customization quick reference section below for all
174 available options, including changing the return type, output target
175 and a lot more.
176
177 np()
178 The np() function behaves exactly like p() except it always returns the
179 string containing the dump (thus ignoring any setting regarding dump
180 mode or destination), and contains no colors by default. In fact, the
181 only way to force a colored np() is to pass "colored => 1" as an
182 argument to each call. It is meant to provide an easy way to fetch the
183 dump and send it to some unsupported target, or appended to some other
184 text (like part of a log message).
185
187 There are 3 possible ways to customize Data::Printer:
188
189 1. [RECOMMENDED] Creating a ".dataprinter" file either on your home
190 directory or your project's base directory, or both, or wherever you
191 set the "DATAPRINTERRC" environment variable to.
192
193 2. Setting custom properties on module load. This will override any
194 setting from your config file on the namespace (package/module) it was
195 called:
196
197 use DDP max_depth => 2, deparse => 1;
198
199 3. Setting custom properties on the actual call to p() or np(). This
200 overrides all other settings:
201
202 p $var, show_tainted => 1, indent => 2;
203
204 The .dataprinter configuration file
205 The most powerful way to customize Data::Printer is to have a
206 ".dataprinter" file in your home directory or your project's root
207 directory. The format is super simple and can be understood in the
208 example below:
209
210 # global settings (note that only full line comments are accepted)
211 max_depth = 1
212 theme = Monokai
213 class.stringify = 0
214
215 # use quotes if you want spaces to be significant:
216 hash_separator = " => "
217
218 # You can set rules that apply only to a specific
219 # caller module (in this case, MyApp::Some::Module):
220 [MyApp::Some::Module]
221 max_depth = 2
222 class.expand = 0
223 escape_chars = nonlatin1
224
225 [MyApp::Other::Module]
226 multiline = 0
227 output = /var/log/myapp/debug.data
228
229 # use 'quiet' to silence all output from p() and np()
230 # called from the specified package.
231 [MyApp::Yet::Another]
232 quiet = 1
233
234 Note that if you set custom properties as arguments to p() or np(), you
235 should group suboptions as a hashref. So while the ".dataprinter" file
236 has ""class.expand = 0"" and ""class.inherited = none"", the equivalent
237 code is ""class => { expand => 0, inherited => 'none' }"".
238
239 live updating your .dataprinter without restarts
240
241 Data::Printer 1.1 introduces a new 'live_update' flag that can be set
242 to a positive integer to enable live updates. When this mode is on,
243 Data::Printer will check if the ".dataprinter" file has been updated
244 and, if so, it will reload it. This way you can toggle features on and
245 off and control output verbosity directly from your ".dataprinter" file
246 without needing to change or restart running code.
247
248 Properties Quick Reference
249 Below are (almost) all available properties and their (hopefully sane)
250 default values. See Data::Printer::Object for further information on
251 each of them:
252
253 # scalar options
254 show_tainted = 1
255 show_unicode = 1
256 show_lvalue = 1
257 print_escapes = 0
258 scalar_quotes = "
259 escape_chars = none
260 string_max = 4096
261 string_preserve = begin
262 string_overflow = '(...skipping __SKIPPED__ chars...)'
263 unicode_charnames = 0
264
265 # array options
266 array_max = 100
267 array_preserve = begin
268 array_overflow = '(...skipping __SKIPPED__ items...)'
269 index = 1
270
271 # hash options
272 hash_max = 100
273 hash_preserve = begin
274 hash_overflow = '(...skipping __SKIPPED__ keys...)'
275 hash_separator = ' '
276 align_hash = 1
277 sort_keys = 1
278 quote_keys = auto
279
280 # general options
281 name = var
282 return_value = pass
283 output = stderr
284 use_prototypes = 1
285 indent = 4
286 show_readonly = 1
287 show_tied = 1
288 show_dualvar = lax
289 show_weak = 1
290 show_refcount = 0
291 show_memsize = 0
292 memsize_unit = auto
293 separator = ,
294 end_separator = 0
295 caller_info = 0
296 caller_message = 'Printing in line __LINE__ of __FILENAME__'
297 max_depth = 0
298 deparse = 0
299 alias = p
300 warnings = 1
301
302 # colorization (see Colors & Themes below)
303 colored = auto
304 theme = Material
305
306 # object output
307 class_method = _data_printer
308 class.parents = 1
309 class.linear_isa = auto
310 class.universal = 1
311 class.expand = 1
312 class.stringify = 1
313 class.show_reftype = 0
314 class.show_overloads = 1
315 class.show_methods = all
316 class.sort_methods = 1
317 class.inherited = none
318 class.format_inheritance = string
319 class.parent_filters = 1
320 class.internals = 1
321
322 Settings' shortcuts
323
324 • as - prints a string before the dump. So:
325
326 p $some_var, as => 'here!';
327
328 is a shortcut to:
329
330 p $some_var, caller_info => 1, caller_message => 'here!';
331
332 • multiline - lets you create shorter dumps. By setting it to 0, we
333 use a single space as linebreak and disable the array index.
334 Setting it to 1 (the default) goes back to using "\n" as linebreak
335 and restore whatever array index you had originally.
336
337 • fulldump - when set to 1, disables all max string/hash/array
338 values. Use this to generate complete (full) dumps of all your
339 content, which is trimmed by default.
340
341 • quiet - when set to 1, disables all data parsing and returns as
342 quickly as possible. Use this to disable all output from p() and
343 np() inside a particular package, either from the 'use' call or
344 from .dataprinter. (introduced in version 1.1)
345
346 Colors & Themes
347 Data::Printer lets you set custom colors for pretty much every part of
348 the content being printed. For example, if you want numbers to be shown
349 in bright green, just put "colors.number = #00ff00" on your
350 configuration file.
351
352 See Data::Printer::Theme for the full list of labels, ways to represent
353 and customize colors, and even how to group them in your own custom
354 theme.
355
356 The colorization is set by the "colored" property. It can be set to 0
357 (never colorize), 1 (always colorize) or 'auto' (the default), which
358 will colorize p() only when there is no "ANSI_COLORS_DISABLED"
359 environment variable, the output is going to the terminal (STDOUT or
360 STDERR) and your terminal actually supports colors.
361
362 Profiles
363 You may bundle your settings and filters into a profile module. It
364 works like a configuration file but gives you the power and flexibility
365 to use Perl code to find out what to print and how to print. It also
366 lets you use CPAN to store your preferred settings and install them
367 into your projects just like a regular dependency.
368
369 use DDP profile => 'ProfileName';
370
371 See Data::Printer::Profile for all the ways to load a profile, a list
372 of available profiles and how to make one yourself.
373
374 Filters
375 Data::Printer works by passing your variable to a different set of
376 filters, depending on whether it's a scalar, a hash, an array, an
377 object, etc. It comes bundled with filters for all native data types
378 (always enabled, but overwritable), including a generic object filter
379 that pretty-prints regular and Moo(se) objects and is even aware of
380 Role::Tiny.
381
382 Data::Printer also comes with filter bundles that can be quickly
383 activated to make it easier to debug binary data and many popular CPAN
384 modules that handle date and time, databases (yes, even DBIx::Class),
385 message digests like MD5 and SHA1, and JSON and Web content like HTTP
386 requests and responses.
387
388 So much so we recommend everyone to activate all bundled filters by
389 putting the following line on your ".dataprinter" file:
390
391 filters = ContentType, DateTime, DB, Digest, Web
392
393 Creating your custom filters is very easy, and you're encouraged to
394 upload them to CPAN. There are many options available under the
395 "Data::Printer::Filter::*" namespace. Check Data::Printer::Filter for
396 more information!
397
398 Making your classes DDP-aware (without adding any dependencies!)
399 The default object filter will first check if the class implements a
400 sub called '_data_printer()' (or whatever you set the "class_method"
401 option to in your settings). If so, Data::Printer will use it to get
402 the string to print instead of making a regular class dump.
403
404 This means you could have the following in one of your classes:
405
406 sub _data_printer {
407 my ($self, $ddp) = @_;
408 return 'Hey, no peeking! But foo contains ' . $self->foo;
409 }
410
411 Notice that you can do this without adding Data::Printer as a
412 dependency to your project! Just write your sub and it will be called
413 with the object to be printed and a $ddp object ready for you. See
414 Data::Printer::Object for how to use it to pretty-print your data.
415
416 Finally, if your object implements string overload or provides a method
417 called "to_string", "as_string" or "stringify", Data::Printer will use
418 it. To disable this behaviour, set "class.stringify = 0" on your
419 ".dataprinter" file, or call p() with "class => { stringify => 0 }".
420
421 Loading a filter for that particular class will of course override
422 these settings.
423
425 You can't pass more than one variable at a time.
426
427 p $foo, $bar; # wrong
428 p $foo; p $bar; # right
429
430 You can't use it in variable declarations (it will most likely not do
431 what you want):
432
433 p my @array = qw(a b c d); # wrong
434 my @array = qw(a b c d); p @array; # right
435
436 If you pass a nonexistant key/index to DDP using prototypes, they will
437 trigger autovivification:
438
439 use DDP;
440 my %foo;
441 p $foo{bar}; # undef, but will create the 'bar' key (with undef)
442
443 my @x;
444 p $x[5]; # undef, but will initialize the array with 5 elements (all undef)
445
446 Slices (both array and hash) must be coerced into actual arrays (or
447 hashes) to properly shown. So if you want to print a slice, instead of
448 doing something like this:
449
450 p @somevar[1..10]; # WRONG! DON'T DO THIS!
451
452 try one of those:
453
454 my @x = @somevar[1..10]; p @x; # works!
455 p [ @somevar[1..0] ]->@*; # also works!
456 p @{[@somevar[1..0]]}; # this works too!!
457
458 Finally, as mentioned before, you cannot pass anonymous references on
459 the default mode of "use_prototypes = 1":
460
461 p { foo => 1 }; # wrong!
462 p %{{ foo => 1 }}; # right
463 p { foo => 1 }->%*; # right on perl 5.24+
464 &p( { foo => 1 } ); # right, but requires the parenthesis
465 sub pp { p @_ }; # wrapping it also lets you use anonymous data.
466
467 use DDP use_prototypes => 0;
468 p { foo => 1 }; # works, but now p(@foo) will fail, you must always pass a ref,
469 # e.g. p(\@foo)
470
472 While we make a genuine effort not to break anything on new releases,
473 sometimes we do. To make things easier for people migrating their code,
474 we have aggregated here a list of all incompatible changes since ever:
475
476 • 1.00 - some defaults changed! Because we added a bunch of new
477 features (including color themes), you may notice some difference
478 on the default output of Data::Printer. Hopefully it's for the
479 best.
480
481 • 1.00 - new ".dataprinter" file format. This should only affect you
482 if you have a ".dataprinter" file. The change was required to
483 avoid calling "eval" on potentially tainted/unknown code. It also
484 provided a much cleaner interface.
485
486 • 1.00 - new way of creating external filters. This only affects you
487 if you write or use external filters. Previously, the sub in your
488 "filters" call would get the reference to be parsed and a
489 properties hash. The properties hash has been replaced with a
490 Data::Printer::Object instance, providing much more power and
491 flexibility. Because of that, the filter call does not export
492 p()/np() anymore, replaced by methods in Data::Printer::Object.
493
494 • 1.00 - new way to call filters. This affects you if you load your
495 own inline filters. The fix is quick and Data::Printer will
496 generate a warning explaining how to do it. Basically, "filters =>
497 { ... }" became "filters => [{ ... }]" and you must replace
498 "-external => [1,2]" with "filters => [1, 2]", or "filters => [1,
499 2, {...}]" if you also have inline filters. This allowed us much
500 more power and flexibility with filters, and hopefully also makes
501 things clearer.
502
503 • 0.36 - p()'s default return value changed from 'dump' to 'pass'.
504 This was a very important change to ensure chained calls and to
505 prevent weird side-effects when p() is the last statement in a sub.
506 Read the full discussion <https://github.com/garu/Data-
507 Printer/issues/16>.
508
509 Any undocumented change was probably unintended. If you bump into one,
510 please file an issue on Github!
511
513 Using p() in some/all of your loaded modules
514 (contributed by Matt S. Trout (mst))
515
516 While debugging your software, you may want to use Data::Printer in
517 some or all loaded modules and not bother having to load it in each and
518 every one of them. To do this, in any module loaded by "myapp.pl",
519 simply write:
520
521 ::p @myvar; # note the '::' in front of p()
522
523 Then call your program like:
524
525 perl -MDDP myapp.pl
526
527 This also has the advantage that if you leave one p() call in by
528 accident, it will trigger a compile-time failure without the -M, making
529 it easier to spot :)
530
531 If you really want to have p() imported into your loaded modules, use
532 the next tip instead.
533
534 Adding p() to all your loaded modules
535 (contributed by Árpád Szász)
536
537 If you wish to automatically add Data::Printer's p() function to every
538 loaded module in you app, you can do something like this to your main
539 program:
540
541 BEGIN {
542 {
543 no strict 'refs';
544 require Data::Printer;
545 my $alias = 'p';
546 foreach my $package ( keys %main:: ) {
547 if ( $package =~ m/::$/ ) {
548 *{ $package . $alias } = \&Data::Printer::p;
549 }
550 }
551 }
552 }
553
554 WARNING This will override all locally defined subroutines/methods that
555 are named "p", if they exist, in every loaded module. If you already
556 have a subroutine named 'p()', be sure to change $alias to something
557 custom.
558
559 If you rather avoid namespace manipulation altogether, use the previous
560 tip instead.
561
562 Using Data::Printer from the Perl debugger
563 (contributed by Árpád Szász and Marcel Grünauer (hanekomu))
564
565 With DB::Pluggable, you can easily set the perl debugger to use
566 Data::Printer to print variable information, replacing the debugger's
567 standard p() function. All you have to do is add these lines to your
568 ".perldb" file:
569
570 use DB::Pluggable;
571 DB::Pluggable->run_with_config( \'[DataPrinter]' ); # note the '\'
572
573 Then call the perl debugger as you normally would:
574
575 perl -d myapp.pl
576
577 Now Data::Printer's p() command will be used instead of the debugger's!
578
579 See perldebug for more information on how to use the perl debugger, and
580 DB::Pluggable for extra functionality and other plugins.
581
582 If you can't or don't want to use DB::Pluggable, or simply want to keep
583 the debugger's p() function and add an extended version using
584 Data::Printer (let's call it px() for instance), you can add these
585 lines to your ".perldb" file instead:
586
587 $DB::alias{px} = 's/px/DB::px/';
588 sub px {
589 my $expr = shift;
590 require Data::Printer;
591 print Data::Printer::p($expr);
592 }
593
594 Now, inside the Perl debugger, you can pass as reference to "px"
595 expressions to be dumped using Data::Printer.
596
597 Using Data::Printer in a perl shell (REPL)
598 Some people really enjoy using a REPL shell to quickly try Perl code.
599 One of the most popular ones out there are Reply and Devel::REPL. If
600 you use them, now you can also see its output with Data::Printer!
601
602 • Reply
603
604 Just install Reply::Plugin::DataPrinter and add a line with
605 "[DataPrinter]" to your ".replyrc" file. That's it! Next time you run
606 the 'reply' REPL, Data::Printer will be used to dump variables!
607
608 • Devel::REPL
609
610 Just install Devel::REPL::Plugin::DataPrinter and add the following
611 line to your re.pl configuration file (usually ".re.pl/repl.rc" in your
612 home dir):
613
614 load_plugin('DataPrinter');
615
616 The next time you run "re.pl", it should dump all your REPL using
617 Data::Printer!
618
619 Easily rendering Data::Printer's output as HTML
620 To turn Data::Printer's output into HTML, you can do something like:
621
622 use HTML::FromANSI;
623 use Data::Printer;
624
625 my $html_output = ansi2html( np($object, colored => 1) );
626
627 In the example above, the $html_output variable contains the HTML
628 escaped output of p($object), so you can print it for later inspection
629 or render it (if it's a web app).
630
631 Using Data::Printer with Template Toolkit
632 (contributed by Stephen Thirlwall (sdt))
633
634 If you use Template Toolkit and want to dump your variables using
635 Data::Printer, install the Template::Plugin::DataPrinter module and
636 load it in your template:
637
638 [% USE DataPrinter %]
639
640 The provided methods match those of "Template::Plugin::Dumper":
641
642 ansi-colored dump of the data structure in "myvar":
643 [% DataPrinter.dump( myvar ) %]
644
645 html-formatted, colored dump of the same data structure:
646 [% DataPrinter.dump_html( myvar ) %]
647
648 The module allows several customization options, even letting you load
649 it as a complete drop-in replacement for Template::Plugin::Dumper so
650 you don't even have to change your previous templates!
651
652 Migrating from Data::Dumper to Data::Printer
653 If you are porting your code to use Data::Printer instead of
654 Data::Dumper, you could replace:
655
656 use Data::Dumper;
657
658 with something like:
659
660 use Data::Printer;
661 sub Dumper { np @_, colored => 1 }
662
663 this sub will accept multiple variables just like Data::Dumper.
664
665 Unified interface for Data::Printer and other debug formatters
666 (contributed by Kevin McGrath (catlgrep))
667
668 If you want a really unified approach to easily flip between debugging
669 outputs, use Any::Renderer and its plugins, like
670 Any::Renderer::Data::Printer.
671
672 Printing stack traces with arguments expanded using Data::Printer
673 (contributed by Sergey Aleynikov (randir))
674
675 There are times where viewing the current state of a variable is not
676 enough, and you want/need to see a full stack trace of a function call.
677
678 The Devel::PrettyTrace module uses Data::Printer to provide you just
679 that. It exports a bt() function that pretty-prints detailed
680 information on each function in your stack, making it easier to spot
681 any issues!
682
683 Troubleshooting apps in real time without changing a single line of your
684 code
685 (contributed by Marcel Grünauer (hanekomu))
686
687 dip is a dynamic instrumentation framework for troubleshooting Perl
688 programs, similar to DTrace
689 <http://opensolaris.org/os/community/dtrace/>. In a nutshell, "dip"
690 lets you create probes for certain conditions in your application that,
691 once met, will perform a specific action. Since it uses Aspect-oriented
692 programming, it's very lightweight and you only pay for what you use.
693
694 "dip" can be very useful since it allows you to debug your software
695 without changing a single line of your original code. And Data::Printer
696 comes bundled with it, so you can use the p() function to view your
697 data structures too!
698
699 # Print a stack trace every time the name is changed,
700 # except when reading from the database.
701 dip -e 'before { print longmess(np $_->{args}[1], colored => 1)
702 if $_->{args}[1] } call "MyObj::name" & !cflow("MyObj::read")' myapp.pl
703
704 You can check dip's own documentation for more information and options.
705
706 Sample output for color fine-tuning
707 (contributed by Yanick Champoux (yanick))
708
709 The "examples/try_me.pl" file included in this distribution has a
710 sample dump with a complex data structure to let you quickly test color
711 schemes.
712
714 As of 1.0.0 this module complies with "Major.Minor.Revision" versioning
715 scheme (SemVer), meaning backwards incompatible changes will trigger a
716 new major number, new features without any breaking changes trigger a
717 new minor number, and simple patches trigger a revision number.
718
720 Many thanks to everyone who helped design and develop this module with
721 patches, bug reports, wishlists, comments and tests. They are
722 (alphabetically):
723
724 Adam Rosenstein, Alexandr Ciornii (chorny), Alexander Hartmaier
725 (abraxxa), Allan Whiteford, Anatoly (Snelius30), Andreas König (andk),
726 Andy Bach, Anthony DeRobertis, Árpád Szász, Athanasios Douitsis
727 (aduitsis), Baldur Kristinsson, Benct Philip Jonsson (bpj), brian d
728 foy, Chad Granum (exodist), Chris Prather (perigrin), Curtis Poe
729 (Ovid), David D Lowe (Flimm), David E. Condon (hhg7), David Golden
730 (xdg), David Precious (bigpresh), David Raab, David E. Wheeler
731 (theory), Damien Krotkine (dams), Denis Howe, dirk, Dotan Dimet, Eden
732 Cardim (edenc), Elliot Shank (elliotjs), Elvin Aslanov, Eugen Konkov
733 (KES777), Fernando Corrêa (SmokeMachine), Fitz Elliott, Florian
734 (fschlich), Frew Schmidt (frew), GianniGi, Graham Knop (haarg), Graham
735 Todd, Gregory J. Oschwald, grr, Håkon Hægland, Iaroslav O. Kosmina
736 (darviarush), Ivan Bessarabov (bessarabv), J Mash, James E. Keenan
737 (jkeenan), Jarrod Funnell (Timbus), Jay Allen (jayallen), Jay Hannah
738 (jhannah), jcop, Jesse Luehrs (doy), Joel Berger (jberger), John S.
739 Anderson (genehack), Karen Etheridge (ether), Kartik Thakore
740 (kthakore), Kevin Dawson (bowtie), Kevin McGrath (catlgrep), Kip
741 Hampton (ubu), Londran, Marcel Grünauer (hanekomu), Marco Masetti
742 (grubert65), Mark Fowler (Trelane), Martin J. Evans, Matthias Muth,
743 Matt S. Trout (mst), Maxim Vuets, Michael Conrad, Mike Doherty
744 (doherty), Nicolas R (atoomic), Nigel Metheringham (nigelm), Nuba
745 Princigalli (nuba), Olaf Alders (oalders), Paul Evans (LeoNerd), Pedro
746 Melo (melo), Philippe Bruhat (BooK), Przemysław Wesołek (jest), Rebecca
747 Turner (iarna), Renato Cron (renatoCRON), Ricardo Signes (rjbs), Rob
748 Hoelz (hoelzro), Salve J. Nilsen (sjn), sawyer, Sebastian Willing
749 (Sewi), Sébastien Feugère (smonff), Sergey Aleynikov (randir), Slaven
750 Rezić, Stanislaw Pusep (syp), Stephen Thirlwall (sdt), sugyan, Tai
751 Paul, Tatsuhiko Miyagawa (miyagawa), Thomas Sibley (tsibley), Tim
752 Heaney (oylenshpeegul), Toby Inkster (tobyink), Torsten Raudssus
753 (Getty), Tokuhiro Matsuno (tokuhirom), trapd00r, Tsai Chung-Kuan, Veesh
754 Goldman (rabbiveesh), vividsnow, Wesley Dal`Col (blabos), y, Yanick
755 Champoux (yanick).
756
757 If I missed your name, please drop me a line!
758
760 Copyright (C) 2011-2023 Breno G. de Oliveira
761
762 This program is free software; you can redistribute it and/or modify it
763 under the terms of either: the GNU General Public License as published
764 by the Free Software Foundation; or the Artistic License.
765
766 See <http://dev.perl.org/licenses/> for more information.
767
769 BECAUSE THIS SOFTWARE IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY
770 FOR THE SOFTWARE, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT
771 WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER
772 PARTIES PROVIDE THE SOFTWARE "AS IS" WITHOUT WARRANTY OF ANY KIND,
773 EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
774 WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE
775 ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE SOFTWARE IS WITH
776 YOU. SHOULD THE SOFTWARE PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL
777 NECESSARY SERVICING, REPAIR, OR CORRECTION.
778
779 IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
780 WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR
781 REDISTRIBUTE THE SOFTWARE AS PERMITTED BY THE ABOVE LICENCE, BE LIABLE
782 TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL, OR
783 CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE
784 SOFTWARE (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING
785 RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A
786 FAILURE OF THE SOFTWARE TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF
787 SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH
788 DAMAGES.
789
790
791
792perl v5.38.0 2023-07-31 Data::Printer(3)