.\" Automatically generated by Pod::Man 4.14 (Pod::Simple 3.40) .\" .\" 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 .. .\" Set up some character translations and predefined strings. \*(-- will .\" give an unbreakable dash, \*(PI will give pi, \*(L" will give a left .\" double quote, and \*(R" will give a right double quote. \*(C+ will .\" give a nicer C++. Capital omega is used to do unbreakable dashes and .\" therefore won't be available. \*(C` and \*(C' expand to `' in nroff, .\" nothing in troff, for use with C<>. .tr \(*W- .ds C+ C\v'-.1v'\h'-1p'\s-2+\h'-1p'+\s0\v'.1v'\h'-1p' .ie n \{\ . ds -- \(*W- . ds PI pi . if (\n(.H=4u)&(1m=24u) .ds -- \(*W\h'-12u'\(*W\h'-12u'-\" diablo 10 pitch . if (\n(.H=4u)&(1m=20u) .ds -- \(*W\h'-12u'\(*W\h'-8u'-\" diablo 12 pitch . ds L" "" . ds R" "" . ds C` "" . ds C' "" 'br\} .el\{\ . ds -- \|\(em\| . ds PI \(*p . ds L" `` . ds R" '' . 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 "XXX 3pm" .TH XXX 3pm "2021-09-12" "perl v5.32.1" "User Contributed Perl Documentation" .\" 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" XXX \- See Your Data in the Nude .SH "VERSION" .IX Header "VERSION" This document describes \s-1XXX\s0 version \fB0.38\fR. .SH "SYNOPSIS" .IX Header "SYNOPSIS" .Vb 7 \& use XXX; \& XXX my $dog = Dog\->new({has => [\*(Aqfleas\*(Aq, \*(Aqstyle\*(Aq]}); \& my $dog = XXX Dog\->new({has => [\*(Aqfleas\*(Aq, \*(Aqstyle\*(Aq]}); \& my $dog = Dog\->new(XXX {has => [\*(Aqfleas\*(Aq, \*(Aqstyle\*(Aq]}); \& my $dog = Dog\->new({XXX has => [\*(Aqfleas\*(Aq, \*(Aqstyle\*(Aq]}); \& my $dog = Dog\->new({has => XXX [\*(Aqfleas\*(Aq, \*(Aqstyle\*(Aq]}); \& my $dog = Dog\->new({has => [XXX \*(Aqfleas\*(Aq, \*(Aqstyle\*(Aq]}); .Ve .SH "DESCRIPTION" .IX Header "DESCRIPTION" \&\f(CW\*(C`XXX.pm\*(C'\fR exports a function called \f(CW\*(C`XXX\*(C'\fR that you can put just about anywhere in your Perl code to make it die with a \s-1YAML\s0 dump of the arguments to its right. .PP The charm of XXX-debugging is that it is easy to type, rarely requires parens and stands out visually so that you remember to remove it. .PP \&\f(CW\*(C`XXX.pm\*(C'\fR also exports \f(CW\*(C`WWW\*(C'\fR, \f(CW\*(C`YYY\*(C'\fR and \f(CW\*(C`ZZZ\*(C'\fR which do similar debugging things. .SH "FUNCTIONS" .IX Header "FUNCTIONS" .ie n .IP """WWW""" 4 .el .IP "\f(CWWWW\fR" 4 .IX Item "WWW" \&\f(CW\*(C`WWW\*(C'\fR will warn a dump of its arguments, and then return the original arguments. This means you can stick it in the middle of expressions. .Sp \&\s-1NOTE:\s0 If you use \s-1WWW\s0 with Test::More, it will \f(CW\*(C`diag()\*(C'\fR rather than \f(CW\*(C`warn()\*(C'\fR. .Sp mnemonic: W for warn .ie n .IP """XXX""" 4 .el .IP "\f(CWXXX\fR" 4 .IX Item "XXX" \&\f(CW\*(C`XXX\*(C'\fR will die with a dump of its arguments. .Sp mnemonic: \s-1XXX\s0 == Death, Nudity .ie n .IP """YYY""" 4 .el .IP "\f(CWYYY\fR" 4 .IX Item "YYY" \&\f(CW\*(C`YYY\*(C'\fR will print a dump of its arguments, and then return the original arguments. This means you can stick it in the middle of expressions. .Sp \&\s-1NOTE:\s0 If you use \s-1YYY\s0 with Test::More, it will \f(CW\*(C`note()\*(C'\fR rather than \f(CW\*(C`print()\*(C'\fR. .Sp mnemonic: \s-1YYY\s0 == Why Why Why??? or \s-1YAML YAML YAML\s0 .ie n .IP """ZZZ""" 4 .el .IP "\f(CWZZZ\fR" 4 .IX Item "ZZZ" \&\f(CW\*(C`ZZZ\*(C'\fR will Carp::confess a dump of its arguments. .Sp mnemonic: You should confess all your sins before you sleep. zzzzzzzz .ie n .IP """DDD""" 4 .el .IP "\f(CWDDD\fR" 4 .IX Item "DDD" \&\f(CW\*(C`DDD\*(C'\fR will start an interactive debugger session using the \f(CW\*(C`Enbugger\*(C'\fR module. By default it will use the Perl debugger, but you can switch to the fancier Devel::Trepan debugger by setting the enviroment variable \&\f(CW\*(C`PERL_XXX_DEBUGGER=trepan\*(C'\fR. .Sp In the debugger session you will be able to both read and modify all variables including lexical variables. .Sp mnemonic: Debug, Debug, Debug! .ie n .SH "USE XXX WITHOUT ""USE XXX;""" .el .SH "USE XXX WITHOUT \f(CWUSE XXX;\fP" .IX Header "USE XXX WITHOUT USE XXX;" If you \f(CW\*(C`export PERL5OPT=\*(Aq\-MXXX=global\*(Aq\*(C'\fR in your shell environment, then \&\f(CW\*(C`XXX\*(C'\fR will be always be loaded, and all the functions will also be exported into the \f(CW\*(C`main\*(C'\fR namespace. That means you can call \f(CW\*(C`XXX\*(C'\fR from any package with \f(CW\*(C`::XXX\*(C'\fR (since \f(CW\*(C`::\*(C'\fR is a synonym for \f(CW\*(C`main::\*(C'\fR). .PP Also \f(CW\*(C`XXX\*(C'\fR will be exported as \f(CW$::XXX\fR which you can use like this: .PP .Vb 1 \& $self\->foo\->$::WWW\->bar; .Ve .PP This will warn a \s-1YAML\s0 dump of \f(CW$self\fR, returning \f(CW$self\fR so that \f(CW\*(C`bar\*(C'\fR will be called correctly. .SH "CONFIGURATION" .IX Header "CONFIGURATION" By default, \f(CW\*(C`XXX\*(C'\fR uses \s-1YAML::PP\s0 to dump your data. You can change this like so: .PP .Vb 8 \& use XXX \-with => \*(AqData::Dumper\*(Aq; \& use XXX \-with => \*(AqData::Dump\*(Aq; \& use XXX \-with => \*(AqData::Dump::Color\*(Aq; \& use XXX \-with => \*(AqYAML\*(Aq; \& use XXX \-with => \*(AqYAML::XS\*(Aq; \& use XXX \-with => \*(AqYAML::SomeOtherYamlModule\*(Aq; \& use XXX \-with => \*(AqJSON::Color\*(Aq; \& use XXX \-with => \*(AqJSON::SomeOtherJsonModule\*(Aq; .Ve .PP You can also use the environment variable \f(CW\*(C`PERL_XXX_DUMPER\*(C'\fR to set the module, for example; .PP .Vb 2 \& PERL_XXX_DUMPER=JSON::Color perl script.pl \& PERL_XXX_DUMPER=YAML::PP::Highlight perl script.pl .Ve .PP Only modules with names beginning with '\s-1YAML\s0' or '\s-1JSON\s0', and the Data::Dumper, Data::Dump, and Data::Dump::Color modules are supported. .PP If you need to load \s-1XXX\s0 with \f(CW\*(C`require\*(C'\fR, you can set the dumper module with the \f(CW$XXX::DumpModule\fR global variable. .PP .Vb 2 \& require XXX; \& $XXX::DumpModule = \*(AqYAML::Syck\*(Aq; \& \& XXX::XXX($variable); .Ve .SH "STACK TRACE LEVEL" .IX Header "STACK TRACE LEVEL" If you call a debugging function that calls \f(CW\*(C`XXX\*(C'\fR for you, \f(CW\*(C`XXX\*(C'\fR will print the wrong file and line number. To force \f(CW\*(C`XXX\*(C'\fR to skip a package in the call stack, just define the \f(CW\*(C`XXX_skip\*(C'\fR constant like this: .PP .Vb 6 \& package MyDebugger; \& use constant XXX_skip => 1; \& sub debug { \& require XXX; \& XXX::XXX(@_); \& } .Ve .PP Now calls to MyDebugger::debug will print the file name you called it from, not from MyDebugger itself. .SH "AUTHOR" .IX Header "AUTHOR" Ingy döt Net .SH "COPYRIGHT AND LICENSE" .IX Header "COPYRIGHT AND LICENSE" Copyright 2006\-2021. Ingy döt Net. .PP This program is free software; you can redistribute it and/or modify it under the same terms as Perl itself. .PP See