1Data::Printer(3)      User Contributed Perl Documentation     Data::Printer(3)
2
3
4

NAME

6       Data::Printer - colored & full-featured pretty print of Perl data
7       structures and objects
8

SYNOPSIS

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

FEATURES

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
59Highly customizable, from indentation size to depth level.  You can
60           even rename the exported p() function!
61
62Beautiful (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
67Filters 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       •   keep your custom settings on a .dataprinter file that allows
82           different options per module being analyzed! You may also create a
83           custom profile class with your preferences and filters and upload
84           it to CPAN.
85
86output to many different targets like files, variables or open
87           handles (defaults to STDERR). You can send your dumps to the screen
88           or anywhere else, and customize this setting on a per-project or
89           even per-module basis, like print everything from Some::Module to a
90           debug.log file with extra info, and everything else to STDERR.
91
92Easy to learn, easy to master. Seriously, the synopsis above and
93           the customization section below cover about 90% of all use cases.
94
95       •   Works on Perl 5.8 and later. Because you can't control where you
96           debug, we try our best to be compatible with all versions of Perl
97           5.
98
99       •   Best of all? All that with No non-core dependencies, Zero. Nada. So
100           don't worry about adding extra weight to your project, as
101           Data::Printer can be easily added/removed.
102

DESCRIPTION

104       The ever-popular Data::Dumper is a fantastic tool, meant to stringify
105       data structures in a way they are suitable for being "eval"'ed back in.
106       The thing is, a lot of people keep using it (and similar ones, like
107       Data::Dump) to print data structures and objects on screen for
108       inspection and debugging, and while you can use those modules for that,
109       it doesn't mean you should.
110
111       This is where Data::Printer comes in. It is meant to do one thing and
112       one thing only:
113
114       format Perl variables and objects to be inspected by a human
115
116       If you want to serialize/store/restore Perl data structures, this
117       module will NOT help you. Try Storable, Data::Dumper, JSON, or
118       whatever. CPAN is full of such solutions!
119
120       Whenever you type "use Data::Printer" or "use DDP", we export two
121       functions to your namespace:
122
123   p()
124       This function pretty-prints the contents of whatever variable to STDERR
125       (by default), and will use colors by default if your terminal supports
126       it.
127
128           p @some_array;
129           p %some_hash;
130           p $scalar_or_ref;
131
132       Note that anonymous structures will only work if you postderef them:
133
134           p [$foo, $bar, $baz]->@*;
135
136       you may also deref it manually:
137
138           p %{{ foo => $foo }};
139
140       or prefix p() with "&":
141
142           &p( [$foo, $bar, $baz] );    # & (note mandatory parenthesis)
143
144       You can pass custom options that will work only on that particular
145       call:
146
147           p @var, as => "some label", colorized => 0;
148           p %var, show_memsize => 1;
149
150       By default, p() prints to STDERR and returns the same variable being
151       dumped. This lets you quickly wrap variables with p() without worrying
152       about changing return values. It means that if you change this:
153
154           sub foo { my $x = shift + 13; $x }
155
156       to this:
157
158           sub foo { my $x = shift + 13; p($x) }
159
160       The function will still return $x after printing the contents. This
161       form of handling data even allows method chaining, so if you want to
162       inspect what's going on in the middle of this:
163
164           $object->foo->bar->baz;
165
166       You can just add "DDP::p" anywhere:
167
168           $object->foo->DDP::p->bar->baz; # what happens to $object after ->foo?
169
170       Check out the customization quick reference section below for all
171       available options, including changing the return type, output target
172       and a lot more.
173
174   np()
175       The np() function behaves exactly like p() except it always returns the
176       string containing the dump (thus ignoring any setting regarding dump
177       mode or destination), and contains no colors by default. In fact, the
178       only way to force a colored np() is to pass "colored => 1" as an
179       argument to each call. It is meant to provide an easy way to fetch the
180       dump and send it to some unsupported target, or appended to some other
181       text (like part of a log message).
182

CUSTOMIZATION

184       There are 3 possible ways to customize Data::Printer:
185
186       1. [RECOMMENDED] Creating a ".dataprinter" file either on your home
187       directory or your project's base directory, or both,  or wherever you
188       set the "DATAPRINTERRC" environment variable to.
189
190       2. Setting custom properties on module load. This will override any
191       setting from your config file on the namespace (package/module) it was
192       called:
193
194           use DDP max_depth => 2, deparse => 1;
195
196       3. Setting custom properties on the actual call to p() or np(). This
197       overrides all other settings:
198
199           p $var, show_tainted => 1, indent => 2;
200
201   The .dataprinter configuration file
202       The most powerful way to customize Data::Printer is to have a
203       ".dataprinter" file in your home directory or your project's root
204       directory. The format is super simple and can be understood in the
205       example below:
206
207           # global settings (note that only full line comments are accepted)
208           max_depth       = 1
209           theme           = Monokai
210           class.stringify = 0
211
212           # use quotes if you want spaces to be significant:
213           hash_separator  = " => "
214
215           # You can set rules that apply only to a specific
216           # caller module (in this case, MyApp::Some::Module):
217           [MyApp::Some::Module]
218           max_depth    = 2
219           class.expand = 0
220           escape_chars = nonlatin1
221
222           [MyApp::Other::Module]
223           multiline = 0
224           output    = /var/log/myapp/debug.data
225
226           # use 'quiet' to silence all output from p() and np()
227           # called from the specified package.
228           [MyApp::Yet::Another]
229           quiet = 1
230
231       Note that if you set custom properties as arguments to p() or np(), you
232       should group suboptions as a hashref. So while the ".dataprinter" file
233       has ""class.expand = 0"" and ""class.inherited = none"", the equivalent
234       code is ""class => { expand => 0, inherited => 'none' }"".
235
236       live updating your .dataprinter without restarts
237
238       Data::Printer 1.1 introduces a new 'live_update' flag that can be set
239       to a positive integer to enable live updates. When this mode is on,
240       Data::Printer will check if the ".dataprinter" file has been updated
241       and, if so, it will reload it. This way you can toggle features on and
242       off and control output verbosity directly from your ".dataprinter" file
243       without needing to change or restart running code.
244
245   Properties Quick Reference
246       Below are (almost) all available properties and their (hopefully sane)
247       default values. See Data::Printer::Object for further information on
248       each of them:
249
250           # scalar options
251           show_tainted      = 1
252           show_unicode      = 1
253           show_lvalue       = 1
254           print_escapes     = 0
255           scalar_quotes     = "
256           escape_chars      = none
257           string_max        = 4096
258           string_preserve   = begin
259           string_overflow   = '(...skipping __SKIPPED__ chars...)'
260           unicode_charnames = 0
261
262           # array options
263           array_max      = 100
264           array_preserve = begin
265           array_overflow = '(...skipping __SKIPPED__ items...)'
266           index          = 1
267
268           # hash options
269           hash_max       = 100
270           hash_preserve  = begin
271           hash_overflow  = '(...skipping __SKIPPED__ keys...)'
272           hash_separator = '   '
273           align_hash     = 1
274           sort_keys      = 1
275           quote_keys     = auto
276
277           # general options
278           name           = var
279           return_value   = pass
280           output         = stderr
281           use_prototypes = 1
282           indent         = 4
283           show_readonly  = 1
284           show_tied      = 1
285           show_dualvar   = lax
286           show_weak      = 1
287           show_refcount  = 0
288           show_memsize   = 0
289           memsize_unit   = auto
290           separator      = ,
291           end_separator  = 0
292           caller_info    = 0
293           caller_message = 'Printing in line __LINE__ of __FILENAME__'
294           max_depth      = 0
295           deparse        = 0
296           alias          = p
297           warnings       = 1
298
299           # colorization (see Colors & Themes below)
300           colored = auto
301           theme   = Material
302
303           # object output
304           class_method             = _data_printer
305           class.parents            = 1
306           class.linear_isa         = auto
307           class.universal          = 1
308           class.expand             = 1
309           class.stringify          = 1
310           class.show_reftype       = 0
311           class.show_overloads     = 1
312           class.show_methods       = all
313           class.sort_methods       = 1
314           class.inherited          = none
315           class.format_inheritance = string
316           class.parent_filters     = 1
317           class.internals          = 1
318
319       Settings' shortcuts
320
321as - prints a string before the dump. So:
322
323               p $some_var, as => 'here!';
324
325           is a shortcut to:
326
327               p $some_var, caller_info => 1, caller_message => 'here!';
328
329multiline - lets you create shorter dumps. By setting it to 0, we
330           use a single space as linebreak and disable the array index.
331           Setting it to 1 (the default) goes back to using "\n" as linebreak
332           and restore whatever array index you had originally.
333
334fulldump - when set to 1, disables all max string/hash/array
335           values. Use this to generate complete (full) dumps of all your
336           content, which is trimmed by default.
337
338quiet - when set to 1, disables all data parsing and returns as
339           quickly as possible. Use this to disable all output from p() and
340           np() inside a particular package, either from the 'use' call or
341           from .dataprinter.  (introduced in version 1.1)
342
343   Colors & Themes
344       Data::Printer lets you set custom colors for pretty much every part of
345       the content being printed. For example, if you want numbers to be shown
346       in bright green, just put "colors.number = #00ff00" on your
347       configuration file.
348
349       See Data::Printer::Theme for the full list of labels, ways to represent
350       and customize colors, and even how to group them in your own custom
351       theme.
352
353       The colorization is set by the "colored" property. It can be set to 0
354       (never colorize), 1 (always colorize) or 'auto' (the default), which
355       will colorize p() only when there is no "ANSI_COLORS_DISABLED"
356       environment variable, the output is going to the terminal (STDOUT or
357       STDERR) and your terminal actually supports colors.
358
359   Profiles
360       You may bundle your settings and filters into a profile module.  It
361       works like a configuration file but gives you the power and flexibility
362       to use Perl code to find out what to print and how to print. It also
363       lets you use CPAN to store your preferred settings and install them
364       into your projects just like a regular dependency.
365
366           use DDP profile => 'ProfileName';
367
368       See Data::Printer::Profile for all the ways to load a profile, a list
369       of available profiles and how to make one yourself.
370
371   Filters
372       Data::Printer works by passing your variable to a different set of
373       filters, depending on whether it's a scalar, a hash, an array, an
374       object, etc. It comes bundled with filters for all native data types
375       (always enabled, but overwritable), including a generic object filter
376       that pretty-prints regular and Moo(se) objects and is even aware of
377       Role::Tiny.
378
379       Data::Printer also comes with filter bundles that can be quickly
380       activated to make it easier to debug binary data and many popular CPAN
381       modules that handle date and time, databases (yes, even DBIx::Class),
382       message digests like MD5 and SHA1, and JSON and Web content like HTTP
383       requests and responses.
384
385       So much so we recommend everyone to activate all bundled filters by
386       putting the following line on your ".dataprinter" file:
387
388           filters = ContentType, DateTime, DB, Digest, Web
389
390       Creating your custom filters is very easy, and you're encouraged to
391       upload them to CPAN. There are many options available under the
392       "Data::Printer::Filter::*" namespace. Check Data::Printer::Filter for
393       more information!
394
395   Making your classes DDP-aware (without adding any dependencies!)
396       The default object filter will first check if the class implements a
397       sub called '_data_printer()' (or whatever you set the "class_method"
398       option to in your settings). If so, Data::Printer will use it to get
399       the string to print instead of making a regular class dump.
400
401       This means you could have the following in one of your classes:
402
403         sub _data_printer {
404             my ($self, $ddp) = @_;
405             return 'Hey, no peeking! But foo contains ' . $self->foo;
406         }
407
408       Notice that you can do this without adding Data::Printer as a
409       dependency to your project! Just write your sub and it will be called
410       with the object to be printed and a $ddp object ready for you. See
411       Data::Printer::Object for how to use it to pretty-print your data.
412
413       Finally, if your object implements string overload or provides a method
414       called "to_string", "as_string" or "stringify", Data::Printer will use
415       it. To disable this behaviour, set "class.stringify = 0" on your
416       ".dataprinter" file, or call p() with "class => { stringify => 0 }".
417
418       Loading a filter for that particular class will of course override
419       these settings.
420

CAVEATS

422       You can't pass more than one variable at a time.
423
424          p $foo, $bar;       # wrong
425          p $foo; p $bar;     # right
426
427       You can't use it in variable declarations (it will most likely not do
428       what you want):
429
430           p my @array = qw(a b c d);          # wrong
431           my @array = qw(a b c d); p @array;  # right
432
433       If you pass a nonexistant key/index to DDP using prototypes, they will
434       trigger autovivification:
435
436           use DDP;
437           my %foo;
438           p $foo{bar}; # undef, but will create the 'bar' key (with undef)
439
440           my @x;
441           p $x[5]; # undef, but will initialize the array with 5 elements (all undef)
442
443       Slices (both array and hash) must be coerced into actual arrays (or
444       hashes) to properly shown. So if you want to print a slice, instead of
445       doing something like this:
446
447           p @somevar[1..10]; # WRONG! DON'T DO THIS!
448
449       try one of those:
450
451           my @x = @somevar[1..10]; p @x;   # works!
452           p [ @somevar[1..0] ]->@*;        # also works!
453           p @{[@somevar[1..0]]};           # this works too!!
454
455       Finally, as mentioned before, you cannot pass anonymous references on
456       the default mode of "use_prototypes = 1":
457
458           p { foo => 1 };       # wrong!
459           p %{{ foo => 1 }};    # right
460           p { foo => 1 }->%*;   # right on perl 5.24+
461           &p( { foo => 1 } );   # right, but requires the parenthesis
462           sub pp { p @_ };      # wrapping it also lets you use anonymous data.
463
464           use DDP use_prototypes => 0;
465           p { foo => 1 };   # works, but now p(@foo) will fail, you must always pass a ref,
466                             # e.g. p(\@foo)
467

BACKWARDS INCOMPATIBLE CHANGES

469       While we make a genuine effort not to break anything on new releases,
470       sometimes we do. To make things easier for people migrating their code,
471       we have aggregated here a list of all incompatible changes since ever:
472
473       •   1.00 - some defaults changed!  Because we added a bunch of new
474           features (including color themes), you may notice some difference
475           on the default output of Data::Printer. Hopefully it's for the
476           best.
477
478       •   1.00 - new ".dataprinter" file format.  This should only affect you
479           if you have a ".dataprinter" file.  The change was required to
480           avoid calling "eval" on potentially tainted/unknown code. It also
481           provided a much cleaner interface.
482
483       •   1.00 - new way of creating external filters.  This only affects you
484           if you write or use external filters.  Previously, the sub in your
485           "filters" call would get the reference to be parsed and a
486           properties hash. The properties hash has been replaced with a
487           Data::Printer::Object instance, providing much more power and
488           flexibility.  Because of that, the filter call does not export
489           p()/np() anymore, replaced by methods in Data::Printer::Object.
490
491       •   1.00 - new way to call filters.  This affects you if you load your
492           own inline filters.  The fix is quick and Data::Printer will
493           generate a warning explaining how to do it. Basically, "filters =>
494           { ... }" became "filters => [{ ... }]" and you must replace
495           "-external => [1,2]" with "filters => [1, 2]", or "filters => [1,
496           2, {...}]" if you also have inline filters. This allowed us much
497           more power and flexibility with filters, and hopefully also makes
498           things clearer.
499
500       •   0.36 - p()'s default return value changed from 'dump' to 'pass'.
501           This was a very important change to ensure chained calls and to
502           prevent weird side-effects when p() is the last statement in a sub.
503           Read the full discussion <https://github.com/garu/Data-
504           Printer/issues/16>.
505
506       Any undocumented change was probably unintended. If you bump into one,
507       please file an issue on Github!
508

TIPS & TRICKS

510   Using p() in some/all of your loaded modules
511       (contributed by Matt S. Trout (mst))
512
513       While debugging your software, you may want to use Data::Printer in
514       some or all loaded modules and not bother having to load it in each and
515       every one of them. To do this, in any module loaded by "myapp.pl",
516       simply write:
517
518         ::p @myvar;  # note the '::' in front of p()
519
520       Then call your program like:
521
522         perl -MDDP myapp.pl
523
524       This also has the advantage that if you leave one p() call in by
525       accident, it will trigger a compile-time failure without the -M, making
526       it easier to spot :)
527
528       If you really want to have p() imported into your loaded modules, use
529       the next tip instead.
530
531   Adding p() to all your loaded modules
532       (contributed by Árpád Szász)
533
534       If you wish to automatically add Data::Printer's p() function to every
535       loaded module in you app, you can do something like this to your main
536       program:
537
538           BEGIN {
539               {
540                   no strict 'refs';
541                   require Data::Printer;
542                   my $alias = 'p';
543                   foreach my $package ( keys %main:: ) {
544                       if ( $package =~ m/::$/ ) {
545                           *{ $package . $alias } = \&Data::Printer::p;
546                       }
547                   }
548               }
549           }
550
551       WARNING This will override all locally defined subroutines/methods that
552       are named "p", if they exist, in every loaded module. If you already
553       have a subroutine named 'p()', be sure to change $alias to something
554       custom.
555
556       If you rather avoid namespace manipulation altogether, use the previous
557       tip instead.
558
559   Using Data::Printer from the Perl debugger
560       (contributed by Árpád Szász and Marcel Grünauer (hanekomu))
561
562       With DB::Pluggable, you can easily set the perl debugger to use
563       Data::Printer to print variable information, replacing the debugger's
564       standard p() function. All you have to do is add these lines to your
565       ".perldb" file:
566
567         use DB::Pluggable;
568         DB::Pluggable->run_with_config( \'[DataPrinter]' );  # note the '\'
569
570       Then call the perl debugger as you normally would:
571
572         perl -d myapp.pl
573
574       Now Data::Printer's p() command will be used instead of the debugger's!
575
576       See perldebug for more information on how to use the perl debugger, and
577       DB::Pluggable for extra functionality and other plugins.
578
579       If you can't or don't want to use DB::Pluggable, or simply want to keep
580       the debugger's p() function and add an extended version using
581       Data::Printer (let's call it px() for instance), you can add these
582       lines to your ".perldb" file instead:
583
584           $DB::alias{px} = 's/px/DB::px/';
585           sub px {
586               my $expr = shift;
587               require Data::Printer;
588               print Data::Printer::p($expr);
589           }
590
591       Now, inside the Perl debugger, you can pass as reference to "px"
592       expressions to be dumped using Data::Printer.
593
594   Using Data::Printer in a perl shell (REPL)
595       Some people really enjoy using a REPL shell to quickly try Perl code.
596       One of the most popular ones out there is Devel::REPL. If you use it,
597       now you can also see its output with Data::Printer!
598
599       Just install Devel::REPL::Plugin::DataPrinter and add the following
600       line to your re.pl configuration file (usually ".re.pl/repl.rc" in your
601       home dir):
602
603         load_plugin('DataPrinter');
604
605       The next time you run "re.pl", it should dump all your REPL using
606       Data::Printer!
607
608   Easily rendering Data::Printer's output as HTML
609       To turn Data::Printer's output into HTML, you can do something like:
610
611         use HTML::FromANSI;
612         use Data::Printer;
613
614         my $html_output = ansi2html( np($object, colored => 1) );
615
616       In the example above, the $html_output variable contains the HTML
617       escaped output of p($object), so you can print it for later inspection
618       or render it (if it's a web app).
619
620   Using Data::Printer with Template Toolkit
621       (contributed by Stephen Thirlwall (sdt))
622
623       If you use Template Toolkit and want to dump your variables using
624       Data::Printer, install the Template::Plugin::DataPrinter module and
625       load it in your template:
626
627          [% USE DataPrinter %]
628
629       The provided methods match those of "Template::Plugin::Dumper":
630
631          ansi-colored dump of the data structure in "myvar":
632          [% DataPrinter.dump( myvar ) %]
633
634          html-formatted, colored dump of the same data structure:
635          [% DataPrinter.dump_html( myvar ) %]
636
637       The module allows several customization options, even letting you load
638       it as a complete drop-in replacement for Template::Plugin::Dumper so
639       you don't even have to change your previous templates!
640
641   Migrating from Data::Dumper to Data::Printer
642       If you are porting your code to use Data::Printer instead of
643       Data::Dumper, you could replace:
644
645         use Data::Dumper;
646
647       with something like:
648
649         use Data::Printer;
650         sub Dumper { np @_, colored => 1 }
651
652       this sub will accept multiple variables just like Data::Dumper.
653
654   Unified interface for Data::Printer and other debug formatters
655       (contributed by Kevin McGrath (catlgrep))
656
657       If you want a really unified approach to easily flip between debugging
658       outputs, use Any::Renderer and its plugins, like
659       Any::Renderer::Data::Printer.
660
661   Printing stack traces with arguments expanded using Data::Printer
662       (contributed by Sergey Aleynikov (randir))
663
664       There are times where viewing the current state of a variable is not
665       enough, and you want/need to see a full stack trace of a function call.
666
667       The Devel::PrettyTrace module uses Data::Printer to provide you just
668       that. It exports a bt() function that pretty-prints detailed
669       information on each function in your stack, making it easier to spot
670       any issues!
671
672   Troubleshooting apps in real time without changing a single line of your
673       code
674       (contributed by Marcel Grünauer (hanekomu))
675
676       dip is a dynamic instrumentation framework for troubleshooting Perl
677       programs, similar to DTrace
678       <http://opensolaris.org/os/community/dtrace/>.  In a nutshell, "dip"
679       lets you create probes for certain conditions in your application that,
680       once met, will perform a specific action. Since it uses Aspect-oriented
681       programming, it's very lightweight and you only pay for what you use.
682
683       "dip" can be very useful since it allows you to debug your software
684       without changing a single line of your original code. And Data::Printer
685       comes bundled with it, so you can use the p() function to view your
686       data structures too!
687
688          # Print a stack trace every time the name is changed,
689          # except when reading from the database.
690          dip -e 'before { print longmess(np $_->{args}[1], colored => 1)
691          if $_->{args}[1] } call "MyObj::name" & !cflow("MyObj::read")' myapp.pl
692
693       You can check dip's own documentation for more information and options.
694
695   Sample output for color fine-tuning
696       (contributed by Yanick Champoux (yanick))
697
698       The "examples/try_me.pl" file included in this distribution has a
699       sample dump with a complex data structure to let you quickly test color
700       schemes.
701

VERSIONING AND UPDATES

703       As of 1.0.0 this module complies with "Major.Minor.Revision" versioning
704       scheme (SemVer), meaning backwards incompatible changes will trigger a
705       new major number, new features without any breaking changes trigger a
706       new minor number, and simple patches trigger a revision number.
707

CONTRIBUTORS

709       Many thanks to everyone who helped design and develop this module with
710       patches, bug reports, wishlists, comments and tests. They are
711       (alphabetically):
712
713       Adam Rosenstein, Alexandr Ciornii (chorny), Alexander Hartmaier
714       (abraxxa), Allan Whiteford, Anatoly (Snelius30), Andreas König (andk),
715       Andy Bach, Anthony DeRobertis, Árpád Szász, Athanasios Douitsis
716       (aduitsis), Baldur Kristinsson, Benct Philip Jonsson (bpj), brian d
717       foy, Chad Granum (exodist), Chris Prather (perigrin), Curtis Poe
718       (Ovid), David D Lowe (Flimm), David E. Condon (hhg7), David Golden
719       (xdg), David Precious (bigpresh), David Raab, David E. Wheeler
720       (theory), Damien Krotkine (dams), Denis Howe, dirk, Dotan Dimet, Eden
721       Cardim (edenc), Elliot Shank (elliotjs), Eugen Konkov (KES777),
722       Fernando Corrêa (SmokeMachine), Fitz Elliott, Florian (fschlich), Frew
723       Schmidt (frew), GianniGi, Graham Knop (haarg), Graham Todd, Gregory J.
724       Oschwald, grr, Håkon Hægland, Iaroslav O. Kosmina (darviarush), Ivan
725       Bessarabov (bessarabv), J Mash, James E. Keenan (jkeenan), Jarrod
726       Funnell (Timbus), Jay Allen (jayallen), Jay Hannah (jhannah), jcop,
727       Jesse Luehrs (doy), Joel Berger (jberger), John S. Anderson (genehack),
728       Karen Etheridge (ether), Kartik Thakore (kthakore), Kevin Dawson
729       (bowtie), Kevin McGrath (catlgrep), Kip Hampton (ubu), Londran, Marcel
730       Grünauer (hanekomu), Marco Masetti (grubert65), Mark Fowler (Trelane),
731       Martin J. Evans, Matt S. Trout (mst), Maxim Vuets, Michael Conrad, Mike
732       Doherty (doherty), Nicolas R (atoomic),  Nigel Metheringham (nigelm),
733       Nuba Princigalli (nuba), Olaf Alders (oalders), Paul Evans (LeoNerd),
734       Pedro Melo (melo), Philippe Bruhat (BooK), Przemysław Wesołek (jest),
735       Rebecca Turner (iarna), Renato Cron (renatoCRON), Ricardo Signes
736       (rjbs), Rob Hoelz (hoelzro), Salve J. Nilsen (sjn), sawyer, Sebastian
737       Willing (Sewi), Sébastien Feugère (smonff), Sergey Aleynikov (randir),
738       Slaven Rezić, Stanislaw Pusep (syp), Stephen Thirlwall (sdt), sugyan,
739       Tai Paul, Tatsuhiko Miyagawa (miyagawa), Thomas Sibley (tsibley), Tim
740       Heaney (oylenshpeegul), Toby Inkster (tobyink), Torsten Raudssus
741       (Getty), Tokuhiro Matsuno (tokuhirom), trapd00r, Tsai Chung-Kuan, Veesh
742       Goldman (rabbiveesh), vividsnow, Wesley Dal`Col (blabos), y, Yanick
743       Champoux (yanick).
744
745       If I missed your name, please drop me a line!
746
748       Copyright (C) 2011-2021 Breno G. de Oliveira
749
750       This program is free software; you can redistribute it and/or modify it
751       under the terms of either: the GNU General Public License as published
752       by the Free Software Foundation; or the Artistic License.
753
754       See <http://dev.perl.org/licenses/> for more information.
755

DISCLAIMER OF WARRANTY

757       BECAUSE THIS SOFTWARE IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY
758       FOR THE SOFTWARE, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT
759       WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER
760       PARTIES PROVIDE THE SOFTWARE "AS IS" WITHOUT WARRANTY OF ANY KIND,
761       EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
762       WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE
763       ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE SOFTWARE IS WITH
764       YOU.  SHOULD THE SOFTWARE PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL
765       NECESSARY SERVICING, REPAIR, OR CORRECTION.
766
767       IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
768       WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR
769       REDISTRIBUTE THE SOFTWARE AS PERMITTED BY THE ABOVE LICENCE, BE LIABLE
770       TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL, OR
771       CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE
772       SOFTWARE (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING
773       RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A
774       FAILURE OF THE SOFTWARE TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF
775       SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH
776       DAMAGES.
777
778
779
780perl v5.36.0                      2023-01-20                  Data::Printer(3)
Impressum