summaryrefslogtreecommitdiffstats
path: root/upstream/mageia-cauldron/man3pm/Data::Dumper.3pm
diff options
context:
space:
mode:
Diffstat (limited to 'upstream/mageia-cauldron/man3pm/Data::Dumper.3pm')
-rw-r--r--upstream/mageia-cauldron/man3pm/Data::Dumper.3pm612
1 files changed, 612 insertions, 0 deletions
diff --git a/upstream/mageia-cauldron/man3pm/Data::Dumper.3pm b/upstream/mageia-cauldron/man3pm/Data::Dumper.3pm
new file mode 100644
index 00000000..ba3cceec
--- /dev/null
+++ b/upstream/mageia-cauldron/man3pm/Data::Dumper.3pm
@@ -0,0 +1,612 @@
+.\" -*- mode: troff; coding: utf-8 -*-
+.\" Automatically generated by Pod::Man 5.01 (Pod::Simple 3.43)
+.\"
+.\" Standard preamble:
+.\" ========================================================================
+.de Sp \" Vertical space (when we can't use .PP)
+.if t .sp .5v
+.if n .sp
+..
+.de Vb \" Begin verbatim text
+.ft CW
+.nf
+.ne \\$1
+..
+.de Ve \" End verbatim text
+.ft R
+.fi
+..
+.\" \*(C` and \*(C' are quotes in nroff, nothing in troff, for use with C<>.
+.ie n \{\
+. ds C` ""
+. ds C' ""
+'br\}
+.el\{\
+. ds C`
+. ds C'
+'br\}
+.\"
+.\" Escape single quotes in literal strings from groff's Unicode transform.
+.ie \n(.g .ds Aq \(aq
+.el .ds Aq '
+.\"
+.\" If the F register is >0, we'll generate index entries on stderr for
+.\" titles (.TH), headers (.SH), subsections (.SS), items (.Ip), and index
+.\" entries marked with X<> in POD. Of course, you'll have to process the
+.\" output yourself in some meaningful fashion.
+.\"
+.\" Avoid warning from groff about undefined register 'F'.
+.de IX
+..
+.nr rF 0
+.if \n(.g .if rF .nr rF 1
+.if (\n(rF:(\n(.g==0)) \{\
+. if \nF \{\
+. de IX
+. tm Index:\\$1\t\\n%\t"\\$2"
+..
+. if !\nF==2 \{\
+. nr % 0
+. nr F 2
+. \}
+. \}
+.\}
+.rr rF
+.\" ========================================================================
+.\"
+.IX Title "Data::Dumper 3pm"
+.TH Data::Dumper 3pm 2023-11-28 "perl v5.38.2" "Perl Programmers Reference Guide"
+.\" For nroff, turn off justification. Always turn off hyphenation; it makes
+.\" way too many mistakes in technical documents.
+.if n .ad l
+.nh
+.SH NAME
+Data::Dumper \- stringified perl data structures, suitable for both printing and "eval"
+.SH SYNOPSIS
+.IX Header "SYNOPSIS"
+.Vb 1
+\& use Data::Dumper;
+\&
+\& # simple procedural interface
+\& print Dumper($foo, $bar);
+\&
+\& # extended usage with names
+\& print Data::Dumper\->Dump([$foo, $bar], [qw(foo *ary)]);
+\&
+\& # configuration variables
+\& {
+\& local $Data::Dumper::Purity = 1;
+\& eval Data::Dumper\->Dump([$foo, $bar], [qw(foo *ary)]);
+\& }
+\&
+\& # OO usage
+\& my $d = Data::Dumper\->new([$foo, $bar], [qw(foo *ary)]);
+\& ...
+\& print $d\->Dump;
+\& ...
+\& $d\->Purity(1)\->Terse(1)\->Deepcopy(1);
+\& eval $d\->Dump;
+.Ve
+.SH DESCRIPTION
+.IX Header "DESCRIPTION"
+Given a list of scalars or reference variables, writes out their contents in
+perl syntax. The references can also be objects. The content of each
+variable is output in a single Perl statement. Handles self-referential
+structures correctly.
+.PP
+The return value can be \f(CW\*(C`eval\*(C'\fRed to get back an identical copy of the
+original reference structure. (Please do consider the security implications
+of eval'ing code from untrusted sources!)
+.PP
+Any references that are the same as one of those passed in will be named
+\&\f(CW$VAR\fR\fIn\fR (where \fIn\fR is a numeric suffix), and other duplicate references
+to substructures within \f(CW$VAR\fR\fIn\fR will be appropriately labeled using arrow
+notation. You can specify names for individual values to be dumped if you
+use the \f(CWDump()\fR method, or you can change the default \f(CW$VAR\fR prefix to
+something else. See \f(CW$Data::Dumper::Varname\fR and \f(CW$Data::Dumper::Terse\fR
+in "Configuration Variables or Methods" below.
+.PP
+The default output of self-referential structures can be \f(CW\*(C`eval\*(C'\fRed, but the
+nested references to \f(CW$VAR\fR\fIn\fR will be undefined, since a recursive
+structure cannot be constructed using one Perl statement. You should set the
+\&\f(CW\*(C`Purity\*(C'\fR flag to 1 to get additional statements that will correctly fill in
+these references. Moreover, if \f(CW\*(C`eval\*(C'\fRed when strictures are in effect,
+you need to ensure that any variables it accesses are previously declared.
+.PP
+In the extended usage form, the references to be dumped can be given
+user-specified names. If a name begins with a \f(CW\*(C`*\*(C'\fR, the output will
+describe the dereferenced type of the supplied reference for hashes and
+arrays, and coderefs. Output of names will be avoided where possible if
+the \f(CW\*(C`Terse\*(C'\fR flag is set.
+.PP
+In many cases, methods that are used to set the internal state of the
+object will return the object itself, so method calls can be conveniently
+chained together.
+.PP
+Several styles of output are possible, all controlled by setting
+the \f(CW\*(C`Indent\*(C'\fR flag. See "Configuration Variables or Methods" below
+for details.
+.SS Methods
+.IX Subsection "Methods"
+.IP "\fIPACKAGE\fR\->new(\fIARRAYREF [\fR, \fIARRAYREF]\fR)" 4
+.IX Item "PACKAGE->new(ARRAYREF [, ARRAYREF])"
+Returns a newly created \f(CW\*(C`Data::Dumper\*(C'\fR object. The first argument is an
+anonymous array of values to be dumped. The optional second argument is an
+anonymous array of names for the values. The names need not have a leading
+\&\f(CW\*(C`$\*(C'\fR sign, and must be comprised of alphanumeric characters. You can begin
+a name with a \f(CW\*(C`*\*(C'\fR to specify that the dereferenced type must be dumped
+instead of the reference itself, for ARRAY and HASH references.
+.Sp
+The prefix specified by \f(CW$Data::Dumper::Varname\fR will be used with a
+numeric suffix if the name for a value is undefined.
+.Sp
+Data::Dumper will catalog all references encountered while dumping the
+values. Cross-references (in the form of names of substructures in perl
+syntax) will be inserted at all possible points, preserving any structural
+interdependencies in the original set of values. Structure traversal is
+depth-first, and proceeds in order from the first supplied value to
+the last.
+.ie n .IP "\fR\fI$OBJ\fR\fI\fR\->Dump \fIor\fR \fIPACKAGE\fR\->Dump(\fIARRAYREF [\fR, \fIARRAYREF]\fR)" 4
+.el .IP "\fR\f(CI$OBJ\fR\fI\fR\->Dump \fIor\fR \fIPACKAGE\fR\->Dump(\fIARRAYREF [\fR, \fIARRAYREF]\fR)" 4
+.IX Item "$OBJ->Dump or PACKAGE->Dump(ARRAYREF [, ARRAYREF])"
+Returns the stringified form of the values stored in the object (preserving
+the order in which they were supplied to \f(CW\*(C`new\*(C'\fR), subject to the
+configuration options below. In a list context, it returns a list
+of strings corresponding to the supplied values.
+.Sp
+The second form, for convenience, simply calls the \f(CW\*(C`new\*(C'\fR method on its
+arguments before dumping the object immediately.
+.ie n .IP \fR\fI$OBJ\fR\fI\fR\->Seen(\fI[HASHREF]\fR) 4
+.el .IP \fR\f(CI$OBJ\fR\fI\fR\->Seen(\fI[HASHREF]\fR) 4
+.IX Item "$OBJ->Seen([HASHREF])"
+Queries or adds to the internal table of already encountered references.
+You must use \f(CW\*(C`Reset\*(C'\fR to explicitly clear the table if needed. Such
+references are not dumped; instead, their names are inserted wherever they
+are encountered subsequently. This is useful especially for properly
+dumping subroutine references.
+.Sp
+Expects an anonymous hash of name => value pairs. Same rules apply for names
+as in \f(CW\*(C`new\*(C'\fR. If no argument is supplied, will return the "seen" list of
+name => value pairs, in a list context. Otherwise, returns the object
+itself.
+.ie n .IP \fR\fI$OBJ\fR\fI\fR\->Values(\fI[ARRAYREF]\fR) 4
+.el .IP \fR\f(CI$OBJ\fR\fI\fR\->Values(\fI[ARRAYREF]\fR) 4
+.IX Item "$OBJ->Values([ARRAYREF])"
+Queries or replaces the internal array of values that will be dumped. When
+called without arguments, returns the values as a list. When called with a
+reference to an array of replacement values, returns the object itself. When
+called with any other type of argument, dies.
+.ie n .IP \fR\fI$OBJ\fR\fI\fR\->Names(\fI[ARRAYREF]\fR) 4
+.el .IP \fR\f(CI$OBJ\fR\fI\fR\->Names(\fI[ARRAYREF]\fR) 4
+.IX Item "$OBJ->Names([ARRAYREF])"
+Queries or replaces the internal array of user supplied names for the values
+that will be dumped. When called without arguments, returns the names. When
+called with an array of replacement names, returns the object itself. If the
+number of replacement names exceeds the number of values to be named, the
+excess names will not be used. If the number of replacement names falls short
+of the number of values to be named, the list of replacement names will be
+exhausted and remaining values will not be renamed. When
+called with any other type of argument, dies.
+.ie n .IP \fR\fI$OBJ\fR\fI\fR\->Reset 4
+.el .IP \fR\f(CI$OBJ\fR\fI\fR\->Reset 4
+.IX Item "$OBJ->Reset"
+Clears the internal table of "seen" references and returns the object
+itself.
+.SS Functions
+.IX Subsection "Functions"
+.IP Dumper(\fILIST\fR) 4
+.IX Item "Dumper(LIST)"
+Returns the stringified form of the values in the list, subject to the
+configuration options below. The values will be named \f(CW$VAR\fR\fIn\fR in the
+output, where \fIn\fR is a numeric suffix. Will return a list of strings
+in a list context.
+.SS "Configuration Variables or Methods"
+.IX Subsection "Configuration Variables or Methods"
+Several configuration variables can be used to control the kind of output
+generated when using the procedural interface. These variables are usually
+\&\f(CW\*(C`local\*(C'\fRized in a block so that other parts of the code are not affected by
+the change.
+.PP
+These variables determine the default state of the object created by calling
+the \f(CW\*(C`new\*(C'\fR method, but cannot be used to alter the state of the object
+thereafter. The equivalent method names should be used instead to query
+or set the internal state of the object.
+.PP
+The method forms return the object itself when called with arguments,
+so that they can be chained together nicely.
+.IP \(bu 4
+\&\f(CW$Data::Dumper::Indent\fR \fIor\fR \fR\f(CI$OBJ\fR\fI\fR\->Indent(\fI[NEWVAL]\fR)
+.Sp
+Controls the style of indentation. It can be set to 0, 1, 2 or 3. Style 0
+spews output without any newlines, indentation, or spaces between list items.
+It is the most compact format possible that can still be called valid perl.
+Style 1 outputs a readable form with newlines but no fancy indentation (each
+level in the structure is simply indented by a fixed amount of whitespace).
+Style 2 (the default) outputs a very readable form which lines up the hash
+keys. Style 3 is like style 2, but also annotates the elements of arrays with
+their index (but the comment is on its own line, so array output consumes
+twice the number of lines). Style 2 is the default.
+.IP \(bu 4
+\&\f(CW$Data::Dumper::Trailingcomma\fR \fIor\fR \fR\f(CI$OBJ\fR\fI\fR\->Trailingcomma(\fI[NEWVAL]\fR)
+.Sp
+Controls whether a comma is added after the last element of an array or
+hash. Even when true, no comma is added between the last element of an array
+or hash and a closing bracket when they appear on the same line. The default
+is false.
+.IP \(bu 4
+\&\f(CW$Data::Dumper::Purity\fR \fIor\fR \fR\f(CI$OBJ\fR\fI\fR\->Purity(\fI[NEWVAL]\fR)
+.Sp
+Controls the degree to which the output can be \f(CW\*(C`eval\*(C'\fRed to recreate the
+supplied reference structures. Setting it to 1 will output additional perl
+statements that will correctly recreate nested references. The default is
+0.
+.IP \(bu 4
+\&\f(CW$Data::Dumper::Pad\fR \fIor\fR \fR\f(CI$OBJ\fR\fI\fR\->Pad(\fI[NEWVAL]\fR)
+.Sp
+Specifies the string that will be prefixed to every line of the output.
+Empty string by default.
+.IP \(bu 4
+\&\f(CW$Data::Dumper::Varname\fR \fIor\fR \fR\f(CI$OBJ\fR\fI\fR\->Varname(\fI[NEWVAL]\fR)
+.Sp
+Contains the prefix to use for tagging variable names in the output. The
+default is "VAR".
+.IP \(bu 4
+\&\f(CW$Data::Dumper::Useqq\fR \fIor\fR \fR\f(CI$OBJ\fR\fI\fR\->Useqq(\fI[NEWVAL]\fR)
+.Sp
+When set, enables the use of double quotes for representing string values.
+Whitespace other than space will be represented as \f(CW\*(C`[\en\et\er]\*(C'\fR, "unsafe"
+characters will be backslashed, and unprintable characters will be output as
+quoted octal integers. The default is 0.
+.IP \(bu 4
+\&\f(CW$Data::Dumper::Terse\fR \fIor\fR \fR\f(CI$OBJ\fR\fI\fR\->Terse(\fI[NEWVAL]\fR)
+.Sp
+When set, Data::Dumper will emit single, non-self-referential values as
+atoms/terms rather than statements. This means that the \f(CW$VAR\fR\fIn\fR names
+will be avoided where possible, but be advised that such output may not
+always be parseable by \f(CW\*(C`eval\*(C'\fR.
+.IP \(bu 4
+\&\f(CW$Data::Dumper::Freezer\fR \fIor\fR $\fIOBJ\fR\->Freezer(\fI[NEWVAL]\fR)
+.Sp
+Can be set to a method name, or to an empty string to disable the feature.
+Data::Dumper will invoke that method via the object before attempting to
+stringify it. This method can alter the contents of the object (if, for
+instance, it contains data allocated from C), and even rebless it in a
+different package. The client is responsible for making sure the specified
+method can be called via the object, and that the object ends up containing
+only perl data types after the method has been called. Defaults to an empty
+string.
+.Sp
+If an object does not support the method specified (determined using
+\&\fBUNIVERSAL::can()\fR) then the call will be skipped. If the method dies a
+warning will be generated.
+.IP \(bu 4
+\&\f(CW$Data::Dumper::Toaster\fR \fIor\fR $\fIOBJ\fR\->Toaster(\fI[NEWVAL]\fR)
+.Sp
+Can be set to a method name, or to an empty string to disable the feature.
+Data::Dumper will emit a method call for any objects that are to be dumped
+using the syntax \f(CW\*(C`bless(DATA, CLASS)\->METHOD()\*(C'\fR. Note that this means that
+the method specified will have to perform any modifications required on the
+object (like creating new state within it, and/or reblessing it in a
+different package) and then return it. The client is responsible for making
+sure the method can be called via the object, and that it returns a valid
+object. Defaults to an empty string.
+.IP \(bu 4
+\&\f(CW$Data::Dumper::Deepcopy\fR \fIor\fR $\fIOBJ\fR\->Deepcopy(\fI[NEWVAL]\fR)
+.Sp
+Can be set to a boolean value to enable deep copies of structures.
+Cross-referencing will then only be done when absolutely essential
+(i.e., to break reference cycles). Default is 0.
+.IP \(bu 4
+\&\f(CW$Data::Dumper::Quotekeys\fR \fIor\fR $\fIOBJ\fR\->Quotekeys(\fI[NEWVAL]\fR)
+.Sp
+Can be set to a boolean value to control whether hash keys are quoted.
+A defined false value will avoid quoting hash keys when it looks like a simple
+string. Default is 1, which will always enclose hash keys in quotes.
+.IP \(bu 4
+\&\f(CW$Data::Dumper::Bless\fR \fIor\fR $\fIOBJ\fR\->Bless(\fI[NEWVAL]\fR)
+.Sp
+Can be set to a string that specifies an alternative to the \f(CW\*(C`bless\*(C'\fR
+builtin operator used to create objects. A function with the specified
+name should exist, and should accept the same arguments as the builtin.
+Default is \f(CW\*(C`bless\*(C'\fR.
+.IP \(bu 4
+\&\f(CW$Data::Dumper::Pair\fR \fIor\fR $\fIOBJ\fR\->Pair(\fI[NEWVAL]\fR)
+.Sp
+Can be set to a string that specifies the separator between hash keys
+and values. To dump nested hash, array and scalar values to JavaScript,
+use: \f(CW\*(C`$Data::Dumper::Pair = \*(Aq : \*(Aq;\*(C'\fR. Implementing \f(CW\*(C`bless\*(C'\fR in JavaScript
+is left as an exercise for the reader.
+A function with the specified name exists, and accepts the same arguments
+as the builtin.
+.Sp
+Default is: \f(CW\*(C` => \*(C'\fR.
+.IP \(bu 4
+\&\f(CW$Data::Dumper::Maxdepth\fR \fIor\fR $\fIOBJ\fR\->Maxdepth(\fI[NEWVAL]\fR)
+.Sp
+Can be set to a positive integer that specifies the depth beyond which
+we don't venture into a structure. Has no effect when
+\&\f(CW\*(C`Data::Dumper::Purity\*(C'\fR is set. (Useful in debugger when we often don't
+want to see more than enough). Default is 0, which means there is
+no maximum depth.
+.IP \(bu 4
+\&\f(CW$Data::Dumper::Maxrecurse\fR \fIor\fR $\fIOBJ\fR\->Maxrecurse(\fI[NEWVAL]\fR)
+.Sp
+Can be set to a positive integer that specifies the depth beyond which
+recursion into a structure will throw an exception. This is intended
+as a security measure to prevent perl running out of stack space when
+dumping an excessively deep structure. Can be set to 0 to remove the
+limit. Default is 1000.
+.IP \(bu 4
+\&\f(CW$Data::Dumper::Useperl\fR \fIor\fR $\fIOBJ\fR\->Useperl(\fI[NEWVAL]\fR)
+.Sp
+Can be set to a boolean value which controls whether the pure Perl
+implementation of \f(CW\*(C`Data::Dumper\*(C'\fR is used. The \f(CW\*(C`Data::Dumper\*(C'\fR module is
+a dual implementation, with almost all functionality written in both
+pure Perl and also in XS ('C'). Since the XS version is much faster, it
+will always be used if possible. This option lets you override the
+default behavior, usually for testing purposes only. Default is 0, which
+means the XS implementation will be used if possible.
+.IP \(bu 4
+\&\f(CW$Data::Dumper::Sortkeys\fR \fIor\fR $\fIOBJ\fR\->Sortkeys(\fI[NEWVAL]\fR)
+.Sp
+Can be set to a boolean value to control whether hash keys are dumped in
+sorted order. A true value will cause the keys of all hashes to be
+dumped in Perl's default sort order. Can also be set to a subroutine
+reference which will be called for each hash that is dumped. In this
+case \f(CW\*(C`Data::Dumper\*(C'\fR will call the subroutine once for each hash,
+passing it the reference of the hash. The purpose of the subroutine is
+to return a reference to an array of the keys that will be dumped, in
+the order that they should be dumped. Using this feature, you can
+control both the order of the keys, and which keys are actually used. In
+other words, this subroutine acts as a filter by which you can exclude
+certain keys from being dumped. Default is 0, which means that hash keys
+are not sorted.
+.IP \(bu 4
+\&\f(CW$Data::Dumper::Deparse\fR \fIor\fR $\fIOBJ\fR\->Deparse(\fI[NEWVAL]\fR)
+.Sp
+Can be set to a boolean value to control whether code references are
+turned into perl source code. If set to a true value, \f(CW\*(C`B::Deparse\*(C'\fR
+will be used to get the source of the code reference. In older versions,
+using this option imposed a significant performance penalty when dumping
+parts of a data structure other than code references, but that is no
+longer the case.
+.Sp
+Caution : use this option only if you know that your coderefs will be
+properly reconstructed by \f(CW\*(C`B::Deparse\*(C'\fR.
+.IP \(bu 4
+\&\f(CW$Data::Dumper::Sparseseen\fR \fIor\fR $\fIOBJ\fR\->Sparseseen(\fI[NEWVAL]\fR)
+.Sp
+By default, Data::Dumper builds up the "seen" hash of scalars that
+it has encountered during serialization. This is very expensive.
+This seen hash is necessary to support and even just detect circular
+references. It is exposed to the user via the \f(CWSeen()\fR call both
+for writing and reading.
+.Sp
+If you, as a user, do not need explicit access to the "seen" hash,
+then you can set the \f(CW\*(C`Sparseseen\*(C'\fR option to allow Data::Dumper
+to eschew building the "seen" hash for scalars that are known not
+to possess more than one reference. This speeds up serialization
+considerably if you use the XS implementation.
+.Sp
+Note: If you turn on \f(CW\*(C`Sparseseen\*(C'\fR, then you must not rely on the
+content of the seen hash since its contents will be an
+implementation detail!
+.SS Exports
+.IX Subsection "Exports"
+.IP Dumper 4
+.IX Item "Dumper"
+.SH EXAMPLES
+.IX Header "EXAMPLES"
+Run these code snippets to get a quick feel for the behavior of this
+module. When you are through with these examples, you may want to
+add or change the various configuration variables described above,
+to see their behavior. (See the testsuite in the Data::Dumper
+distribution for more examples.)
+.PP
+.Vb 1
+\& use Data::Dumper;
+\&
+\& package Foo;
+\& sub new {bless {\*(Aqa\*(Aq => 1, \*(Aqb\*(Aq => sub { return "foo" }}, $_[0]};
+\&
+\& package Fuz; # a weird REF\-REF\-SCALAR object
+\& sub new {bless \e($_ = \e \*(Aqfu\e\*(Aqz\*(Aq), $_[0]};
+\&
+\& package main;
+\& $foo = Foo\->new;
+\& $fuz = Fuz\->new;
+\& $boo = [ 1, [], "abcd", \e*foo,
+\& {1 => \*(Aqa\*(Aq, 023 => \*(Aqb\*(Aq, 0x45 => \*(Aqc\*(Aq},
+\& \e\e"p\eq\e\*(Aqr", $foo, $fuz];
+\&
+\& ########
+\& # simple usage
+\& ########
+\&
+\& $bar = eval(Dumper($boo));
+\& print($@) if $@;
+\& print Dumper($boo), Dumper($bar); # pretty print (no array indices)
+\&
+\& $Data::Dumper::Terse = 1; # don\*(Aqt output names where feasible
+\& $Data::Dumper::Indent = 0; # turn off all pretty print
+\& print Dumper($boo), "\en";
+\&
+\& $Data::Dumper::Indent = 1; # mild pretty print
+\& print Dumper($boo);
+\&
+\& $Data::Dumper::Indent = 3; # pretty print with array indices
+\& print Dumper($boo);
+\&
+\& $Data::Dumper::Useqq = 1; # print strings in double quotes
+\& print Dumper($boo);
+\&
+\& $Data::Dumper::Pair = " : "; # specify hash key/value separator
+\& print Dumper($boo);
+\&
+\&
+\& ########
+\& # recursive structures
+\& ########
+\&
+\& @c = (\*(Aqc\*(Aq);
+\& $c = \e@c;
+\& $b = {};
+\& $a = [1, $b, $c];
+\& $b\->{a} = $a;
+\& $b\->{b} = $a\->[1];
+\& $b\->{c} = $a\->[2];
+\& print Data::Dumper\->Dump([$a,$b,$c], [qw(a b c)]);
+\&
+\&
+\& $Data::Dumper::Purity = 1; # fill in the holes for eval
+\& print Data::Dumper\->Dump([$a, $b], [qw(*a b)]); # print as @a
+\& print Data::Dumper\->Dump([$b, $a], [qw(*b a)]); # print as %b
+\&
+\&
+\& $Data::Dumper::Deepcopy = 1; # avoid cross\-refs
+\& print Data::Dumper\->Dump([$b, $a], [qw(*b a)]);
+\&
+\&
+\& $Data::Dumper::Purity = 0; # avoid cross\-refs
+\& print Data::Dumper\->Dump([$b, $a], [qw(*b a)]);
+\&
+\& ########
+\& # deep structures
+\& ########
+\&
+\& $a = "pearl";
+\& $b = [ $a ];
+\& $c = { \*(Aqb\*(Aq => $b };
+\& $d = [ $c ];
+\& $e = { \*(Aqd\*(Aq => $d };
+\& $f = { \*(Aqe\*(Aq => $e };
+\& print Data::Dumper\->Dump([$f], [qw(f)]);
+\&
+\& $Data::Dumper::Maxdepth = 3; # no deeper than 3 refs down
+\& print Data::Dumper\->Dump([$f], [qw(f)]);
+\&
+\&
+\& ########
+\& # object\-oriented usage
+\& ########
+\&
+\& $d = Data::Dumper\->new([$a,$b], [qw(a b)]);
+\& $d\->Seen({\*(Aq*c\*(Aq => $c}); # stash a ref without printing it
+\& $d\->Indent(3);
+\& print $d\->Dump;
+\& $d\->Reset\->Purity(0); # empty the seen cache
+\& print join "\-\-\-\-\en", $d\->Dump;
+\&
+\&
+\& ########
+\& # persistence
+\& ########
+\&
+\& package Foo;
+\& sub new { bless { state => \*(Aqawake\*(Aq }, shift }
+\& sub Freeze {
+\& my $s = shift;
+\& print STDERR "preparing to sleep\en";
+\& $s\->{state} = \*(Aqasleep\*(Aq;
+\& return bless $s, \*(AqFoo::ZZZ\*(Aq;
+\& }
+\&
+\& package Foo::ZZZ;
+\& sub Thaw {
+\& my $s = shift;
+\& print STDERR "waking up\en";
+\& $s\->{state} = \*(Aqawake\*(Aq;
+\& return bless $s, \*(AqFoo\*(Aq;
+\& }
+\&
+\& package main;
+\& use Data::Dumper;
+\& $a = Foo\->new;
+\& $b = Data::Dumper\->new([$a], [\*(Aqc\*(Aq]);
+\& $b\->Freezer(\*(AqFreeze\*(Aq);
+\& $b\->Toaster(\*(AqThaw\*(Aq);
+\& $c = $b\->Dump;
+\& print $c;
+\& $d = eval $c;
+\& print Data::Dumper\->Dump([$d], [\*(Aqd\*(Aq]);
+\&
+\&
+\& ########
+\& # symbol substitution (useful for recreating CODE refs)
+\& ########
+\&
+\& sub foo { print "foo speaking\en" }
+\& *other = \e&foo;
+\& $bar = [ \e&other ];
+\& $d = Data::Dumper\->new([\e&other,$bar],[\*(Aq*other\*(Aq,\*(Aqbar\*(Aq]);
+\& $d\->Seen({ \*(Aq*foo\*(Aq => \e&foo });
+\& print $d\->Dump;
+\&
+\&
+\& ########
+\& # sorting and filtering hash keys
+\& ########
+\&
+\& $Data::Dumper::Sortkeys = \e&my_filter;
+\& my $foo = { map { (ord, "$_$_$_") } \*(AqI\*(Aq..\*(AqQ\*(Aq };
+\& my $bar = { %$foo };
+\& my $baz = { reverse %$foo };
+\& print Dumper [ $foo, $bar, $baz ];
+\&
+\& sub my_filter {
+\& my ($hash) = @_;
+\& # return an array ref containing the hash keys to dump
+\& # in the order that you want them to be dumped
+\& return [
+\& # Sort the keys of %$foo in reverse numeric order
+\& $hash eq $foo ? (sort {$b <=> $a} keys %$hash) :
+\& # Only dump the odd number keys of %$bar
+\& $hash eq $bar ? (grep {$_ % 2} keys %$hash) :
+\& # Sort keys in default order for all other hashes
+\& (sort keys %$hash)
+\& ];
+\& }
+.Ve
+.SH BUGS
+.IX Header "BUGS"
+Due to limitations of Perl subroutine call semantics, you cannot pass an
+array or hash. Prepend it with a \f(CW\*(C`\e\*(C'\fR to pass its reference instead. This
+will be remedied in time, now that Perl has subroutine prototypes.
+For now, you need to use the extended usage form, and prepend the
+name with a \f(CW\*(C`*\*(C'\fR to output it as a hash or array.
+.PP
+\&\f(CW\*(C`Data::Dumper\*(C'\fR cheats with CODE references. If a code reference is
+encountered in the structure being processed (and if you haven't set
+the \f(CW\*(C`Deparse\*(C'\fR flag), an anonymous subroutine that
+contains the string '"DUMMY"' will be inserted in its place, and a warning
+will be printed if \f(CW\*(C`Purity\*(C'\fR is set. You can \f(CW\*(C`eval\*(C'\fR the result, but bear
+in mind that the anonymous sub that gets created is just a placeholder.
+Even using the \f(CW\*(C`Deparse\*(C'\fR flag will in some cases produce results that
+behave differently after being passed to \f(CW\*(C`eval\*(C'\fR; see the documentation
+for B::Deparse.
+.PP
+SCALAR objects have the weirdest looking \f(CW\*(C`bless\*(C'\fR workaround.
+.SS NOTE
+.IX Subsection "NOTE"
+Different runs of Perl will have different
+ordering of hash keys. The change was done for greater security,
+see "Algorithmic Complexity Attacks" in perlsec. This means that
+different runs of Perl will have different Data::Dumper outputs if
+the data contains hashes. If you need to have identical Data::Dumper
+outputs from different runs of Perl, use the environment variable
+PERL_HASH_SEED, see "PERL_HASH_SEED" in perlrun. Using this restores
+the old (platform-specific) ordering: an even prettier solution might
+be to use the \f(CW\*(C`Sortkeys\*(C'\fR filter of Data::Dumper.
+.SH AUTHOR
+.IX Header "AUTHOR"
+Gurusamy Sarathy gsar@activestate.com
+.PP
+Copyright (c) 1996\-2019 Gurusamy Sarathy. All rights reserved.
+This program is free software; you can redistribute it and/or
+modify it under the same terms as Perl itself.
+.SH VERSION
+.IX Header "VERSION"
+Version 2.188
+.SH "SEE ALSO"
+.IX Header "SEE ALSO"
+\&\fBperl\fR\|(1)