1Debug::ShowStuff(3) User Contributed Perl Documentation Debug::ShowStuff(3)
2
3
4
6 Debug::ShowStuff - A collection of handy debugging routines for
7 displaying the values of variables with a minimum of coding.
8
10 Here's a sampling of a few of my favorite functions in this module.
11
12 use Debug::ShowStuff ':all';
13
14 # display values of a hash or hash reference
15 showhash %hash;
16 showhash $hashref;
17
18 # display values of an array or array reference
19 showarr @arr;
20 showarr $arrref;
21
22 # show all the params received through CGI
23 showcgi();
24
25 # A particularly fancy utility: display STDERR at top of web page
26 my $warnings = showstderr;
27
29 "Debug::ShowStuff" can be installed with the usual routine:
30
31 perl Makefile.PL
32 make
33 make test
34 make install
35
37 "Debug::ShowStuff" grew dynamically from my needs in debugging code. I
38 found myself doing the same tasks over and over... displaying the keys
39 and values in a hash, displaying the elements in an array, displaying
40 the output of STDERR in a web page, etc. "Debug::ShowStuff" began as
41 two or three of my favorite routines and grew as I added to that
42 collection. Finally I decided to publish these tools in the hope that
43 other Perl programmers will find them useful.
44
45 Not for production work
46 "Debug::ShowStuff" is for debugging, not for production work. It does
47 not always output the actual value of something, but rather information
48 about the value. For example, the following code outputs the actual
49 value in the first line, but a note about the value in the second.
50
51 println 'my value';
52 println undef;
53
54 which outputs
55
56 my value
57 [undef]
58
59 I would discourage you from using "Debug::ShowStuff" in production
60 code. "Debug::ShowStuff" is only for quick-n-dirty displays of
61 variable values in order to debug your code.
62
63 Text and web modes
64 The functions in "Debug::ShowStuff" are designed to output either in
65 plain text mode (like if you're running the script from a command
66 prompt), or in web mode (like from a CGI). If the script appears to be
67 running in a CGI or other web mode (see the "inweb" function) then
68 values are output using HTML, with special HTML characters escaped for
69 proper display. Othewise the values are output as they are.
70
71 Generally you won't need to bother telling "Debug::ShowStuff" if you're
72 in text or web mode... it figures it out on its own.
73
74 Dynamic output/return: different than previous versions
75 NOTE: The dynamic behavior of "show" functions has changed since
76 earlier versions of Debug::ShowStuff. "show" functions now always
77 outputs to STDOUT or STDERR unless $Debug::ShowStuff::always_void is
78 set to false. By default $always_void is true.
79
80 If $always_void is false, then the following applies:
81
82 The functions that start with "show" dynamically either output to
83 STDOUT or STDERR or return a string, depending on the context in which
84 the functions are called. For example, if you call showhash in a void
85 context:
86
87 showhash %myhash;
88
89 then the contents of %myhash are output to STDOUT. On the other hand,
90 if the function is called in scalar context:
91
92 my $var = showhash(%myhash);
93
94 then the same string that would have been output to STDOUT is instead
95 returned and stored in $var.
96
97 By default, output is sent to STDOUT, not STDERR. You can change the
98 default output to STDERR using the "setoutput" command. See the docs
99 for that command for more detail.
100
101 Displaying "invisible" strings
102 To facilitate telling the difference between "[undef]" and an empty
103 string, functions output the strings "[undef]" and "[empty string]".
104 So, for example, this code:
105
106 println undef;
107 println "";
108
109 produces this:
110
111 [undef]
112 [empty string]
113
115 println
116 "println" was the original Debug::ShowStuff function. It simply
117 outputs the given values.
118
119 In text mode it adds a newline to the end.
120
121 For example, this code:
122
123 println "hello world";
124
125 produces this output, including the newline:
126
127 hello world
128
129 In web mode it puts the output inside a <p> element. The values are
130 HTML escaped so that HTML-significant characters like < and > are
131 actually displayed as < and >. The <p> element has CSS styles set so
132 that the characters are always black, the background is always white,
133 text is left-aligned, and the <p> element has a black border,
134 regardless of the styles of the surrounding elements. So, for example,
135 in web mode, the following code:
136
137 println 'whatever';
138
139 outputs the following HTML:
140
141 <p style="background-color:white;color:black;text-align:left">whatever</p>
142
143 Like other "show" functions, undef is output as the string "[undef]"
144 and an empty string is output as the string "[empty string]".
145
146 Values in the arguments array are output concatenated together with no
147 spaces in between. Each value is evaluated independently for if it is
148 undef, empty string, or a string with visible content. So, for
149 example, this code:
150
151 println "whatever", "", undef, "dude";
152
153 outputs this:
154
155 whatever[empty string][undef]dude
156
157 indent()
158 "indent()" is for situations where you're outputting a lot of stuff and
159 you want to tidy up the putput with indentation. In text mode the
160 output is indented with 3 spaces per indentation level. In web mode
161 the output is indented with 20px per indentation level.
162
163 "indent()" must be assigned to a variable or it has no effect.
164 "indent()" increases the indent level by one. When the variable goes
165 out of scope, the indent level is decreased by one.
166
167 For example suppose you want to display the values of records from a
168 database. You might loop through the records, outputting them like
169 this:
170
171 while (my $record = $sth->fetchrow_hashref) {
172 println $record->{'name_nick'};
173 my $indent = indent();
174 showhash $record;
175 }
176
177 That would produce output something like this:
178
179 Ricky
180 ---------------------------------------
181 name_first = Rick
182 name_last = Adams
183 ---------------------------------------
184
185 Dan
186 ---------------------------------------
187 name_first = Daniel
188 name_last = Bradley
189 ---------------------------------------
190
191 By default, three spaces are used to indent. To change that set
192 $Debug::ShowStuff::indent_tab to whatever string you want to use for
193 indentation.
194
195 option: bottom_space
196
197 The "bottom_space" option indicates to output an extra line at the
198 bottom of the indented output, just to give some extra division before
199 the next batch of code. For example, the following code does not use
200 "bottom_space":
201
202 foreach my $name (qw[Larry Moe]) {
203 println $name;
204 my $indent = indent(bottom_space=>1);
205 println 'years: ', length($name);
206 }
207
208 and so produces the following output:
209
210 Larry
211 years: 5
212 Moe
213 years: 3
214
215 But this code:
216
217 foreach my $name (qw[Larry Moe]) {
218 println $name;
219 my $indent = indent(bottom_space=>1);
220 println 'years: ', length($name);
221 }
222
223 produces this output:
224
225 Larry
226 years: 5
227
228 Moe
229 years: 3
230
231 showstuff()
232 This function turns on/off most of the functions in this module, with
233 one important exception explained below. The function also returns the
234 state of whether or not Debug::ShowStuff is on/off.
235
236 If a parameter is sent, that param is used to turn display on/off. The
237 value is stored in the global variable $Debug::ShowStuff::active.
238
239 The function is also used by most subroutines to determine if they
240 should actually output anything. $Debug::ShowStuff::active is not the
241 only criteria used to determine if Debug::ShowStuff is active. The
242 algorithm is as follows:
243
244 - If the environment variable $ENV{'SHOWSTUFF'} is defined and false
245 then showstuff() returns false regardless of the state of $active.
246
247 - If the environment variable $ENV{'SHOWSTUFF'} is not defined or is
248 defined and true then showstuff() uses $Debug::ShowStuff::active to
249 determine on/off.
250
251 The purpose of this algorithm is to allow the use of debugging display
252 in situations where one perl script calls another, such as in
253 regression testing.
254
255 For example, suppose you have a script as follows:
256
257 #!/usr/bin/perl -w
258 use strict;
259 use Debug::ShowStuff ':all';
260
261 my ($rv);
262
263 println 'running my_function()';
264 $rv = my_function();
265 println 'the returned value is: ', $rv;
266
267 $rv or die 'error!';
268
269 The output of the script might look something like this:
270
271 running my_function()
272 1
273
274 Now suppose you call that and other scripts from some OTHER script, and
275 you don't want the screen cluttered with all that debugging, you just
276 want to see if all those scripts run successfully. You could use
277 $ENV{'SHOWSTUFF'} to turn off showing stuff:
278
279 #!/usr/bin/perl -w
280 use strict;
281 use Debug::ShowStuff ':all';
282
283 my @tests = ("./script1.pl", "./script2.pl", "./script3.pl");
284 $ENV{'SHOWSTUFF'} = 0;
285
286 foreach my $test () {
287 system($test) and die "$test failed";
288 }
289
290 In that case, none of the stuff from the test scripts would be output.
291
292 printnorm
293 Works like println but doesn't add trailing newline. In web
294 environment uses <span> instead of <p>.
295
296 showhash
297 Displays the keys and values in a hash. Input is either a single hash
298 reference or a regular hash. The key=values pairs are sorted by the
299 names of the keys.
300
301 So, for example, the following code:
302
303 my %hash = (
304 Larry => 'curly headed guy',
305 Curly => 'funny bald guy',
306 Moe => 'guy in charge',
307 );
308
309 showhash %hash;
310
311 Produces the following output. Notice that the keys are in alphabetic
312 order:
313
314 ---------------------------------------
315 Curly = funny bald guy
316 Larry = curly headed guy
317 Moe = guy in charge
318 ---------------------------------------
319
320 This code, using a hash reference, produces exactly the same output:
321
322 my $hash = {
323 Larry => 'curly headed guy',
324 Curly => 'funny bald guy',
325 Moe => 'guy in charge',
326 };
327
328 showhash $hash;
329
330 If the hash is empty, then that fact is output. So, this code:
331
332 showhash {};
333
334 produces this output:
335
336 ---------------------------------------
337 [empty hash]
338 ---------------------------------------
339
340 If an undef value is sent instead of a hashref, then that fact is
341 displayed instead of a hash. For example consider the following code
342 that uses a variable that is undef:
343
344 my ($hash);
345 showhash $hash;
346
347 That code produces this output:
348
349 ---------------------------------------
350 Only one element input and it was undefined
351 ---------------------------------------
352
353 Optional arguments only come into play if the first argument is a
354 hashref.
355
356 option: title => "string"
357
358 If this option is sent, the string is displayed at the top of the
359 display of the hash values. So this code:
360
361 my $hash = {
362 Larry => 'curly headed guy',
363 Curly => 'funny bald guy',
364 Moe => 'guy in charge',
365 };
366
367 showhash $hash, title=>'Stooges';
368
369 produces this output:
370
371 --- Stooges ---------------------------------
372 Curly = funny bald guy
373 Larry = curly headed guy
374 Moe = guy in charge
375 ---------------------------------------------
376
377 option: line_cut => 1
378
379 If the "line_cut" option is sent, then each value is truncated after
380 the first newline if there is one. The fact that there is more output
381 is mentioned. So the following code:
382
383 my $hash = {
384 Larry => "curly\nheaded guy",
385 Curly => "funny\nbald guy",
386 Moe => "guy\nin charge",
387 };
388
389 showhash $hash, line_cut =>1;
390
391 produces this output.
392
393 ---------------------------------------
394 Curly = funny [more lines...]
395 Larry = curly [more lines...]
396 Moe = guy [more lines...]
397 ---------------------------------------
398
399 Several other options do exactly the same thing: linecut, line_chop,
400 and first_line.
401
402 showarr, showarray
403 Displays the values of an array. c<showarr> and c<showarray>
404
405 Each element is displayed in a table row (in web mode) or on a separate
406 line (in text mode).
407
408 If "showarray" receives exactly one argument, and if that item is an
409 array reference, then the routine assumes that you want to display the
410 elements in the referenced array. Therefore, the following blocks of
411 code display the same thing:
412
413 showarray @myarr;
414 showarray \@myarr;
415
416 showarraydiv
417 Works just like "showarray", except that in text mode displays a solid
418 line between each element of the array.
419
420 showscalar
421 Outputs the value of a scalar. The name is slightly innaccurate: you
422 can input an array. The array will be joined together to form a single
423 scalar.
424
425 Actually, I hardly ever use "showscalar", but it seemed unbalanced to
426 have "showhash" and "showarray" without "showscalar".
427
428 showcgi
429 Displays the CGI parameter keys and values. This sub always outputs
430 HTML.
431
432 There are several optional parameters, described in the following
433 sections.
434
435 option: q
436
437 The optional parameter "q", may be a CGI query object:
438
439 my $query = CGI->new();
440 showcgi q => $query;
441
442 If "q" is not sent, then a CGI object is created on the fly.
443
444 option: skipempty
445
446 If the optional parameter "skipempty" is true:
447
448 showcgi skipempty => 1;
449
450 then CGI params that are empty (i.e. do not have at least one non-space
451 character) are not displayed.
452
453 option: skip
454
455 "skip" sets a list of parameters to not display. For example, if you
456 don't want to see the "choices" or "toppings" params, then call showcgi
457 like this:
458
459 showcgi skip => ['choices', 'toppings'];
460
461 Single item lists can be passed in directly without putting them in an
462 anonymous array:
463
464 showcgi skip => 'choices';
465
466 showref($ref, %options)
467 Displays a hash, array, or scalar references, treeing down through
468 other references it contains. So, for example, the following code:
469
470 my $ob = {
471 name => 'Raha',
472 email => 'raha@idocs.com',
473 friends => [
474 'Shalom',
475 'Joe',
476 'Furocha',
477 ],
478 };
479
480 showref $ob;
481
482 produces the following output:
483
484 /-----------------------------------------------------------\
485 friends =
486 ARRAY
487 Shalom
488 Joe
489 Furocha
490 email = raha@idocs.com
491 name = Raha
492 \-----------------------------------------------------------/
493
494 The values of the hash or arrays being referenced are only displayed
495 once, so you're safe from infinite recursion.
496
497 There are several optional parameters, described in the following
498 sections.
499
500 option: maxhash
501
502 The "maxhash" option allows you to indicate the maximum number of hash
503 elements to display. If a hash has more then "maxhash" elements then
504 none of them are displayed or recursed through, and instead an
505 indicator of how many elements there are is output. So, for example,
506 the following command only displays the hash values if there are 10 or
507 fewer elements in the hash:
508
509 showref $myob, maxhash=>10;
510
511 If "maxhash" is not sent then there is no maximum.
512
513 option: maxarr
514
515 The "maxarr" option allows you to indicate the maximum number of array
516 elements to display. If an array has more then "maxarr" elements then
517 none of them are displayed or recursed through, and instead an
518 indicator of how many elements there are is output. If "maxarr" is not
519 sent then there is no maximum.
520
521 option: depth
522
523 The "depth" option allows you to indicate a maximum depth to display in
524 the tree. If "depth" is not sent then there is no maximum depth.
525
526 option: skip
527
528 A list of hash elements to skip. Only applies to the top element and
529 only if it is a hash.
530
531 option: skipall
532
533 Works the same as "skip", but applies to all hashes in the structure,
534 not just the top-level hash.
535
536 printhr
537 Prints a horizontal rule. Handy for dividing up multiple println's.
538
539 In text mode, the horizontal rule is a set of 80 dashes. In web mode,
540 the output is either a <hr> element or a <p> element, depending on the
541 title option (see "title" below).
542
543 So, for example, the following line outputs a simple horizontal rule:
544
545 option: title
546
547 If the "title"option is sent, the title is embedded in the horizontal
548 rule. So, for example, the following code produces a horizontal rule
549 with with the string "test" embedded in it:
550
551 printhr title=>'test';
552
553 If only one param is sent, it is assumed that param is the title. So
554 the' following code produces exactly the same thing as the example
555 above:
556
557 printhr 'test';
558
559 In web mode, a title changes the HTML element that is output. If no
560 title is given then printhr outputs an <hr> element. If a title is
561 given the output is "p" element with the title as the content. The <p>
562 element has a gray background and a black border.
563
564 option: dash
565
566 If the "dash"option is sent, the given character is used as the
567 separator. This param only applies to text mode;
568
569 preln
570 Outputs the given values inside a <pre> element. If not in a web
571 environment, works just like preln.
572
573 dieln
574 Works like the "die" command, except it always adds an end-of-line to
575 the input array so you never get those "at line blah-blah-blah"
576 additions.
577
578 devexit
579 Works like "dieln" except it prepends 'dev exit: ' to the end of the
580 string. If no string is sent, just outputs "dev exit".
581
582 diearr
583 Displays an array, then dies using "dieln".
584
585 pressenter
586 For use at the command line. Outputs a prompt to "press enter to
587 continue", then waits for you to do exactly that.
588
589 confirm
590 Prompts the user for a y or n. Exits quietly if y is pressed.
591
592 httpheader
593 Outputs a text/html HTTP header. Not useful if you're using mod_perl.
594
595 showstderr
596 This function allows you to see, in the web page produced by a CGI,
597 everything the CGI output to STDERR.
598
599 To use "showstderr", assign the return value of the function to a
600 variable that is scoped to the entire CGI script:
601
602 my $stderr = showstderr();
603
604 You need not do anything more with that variable. The object reference
605 by your variable holds on to everything output to both STDOUT and
606 STDERR. When the variable goes out of scope, the object outputs the
607 STDOUT content with the STDERR content at the top of the web page.
608
609 forcetext, forceweb, forcenone
610 By default, Debug::Showstuff guesses if it should be in text or web
611 mode. These functions are for when you want to explicitly tell
612 Debug::ShowStuff what mode it should be in. "forcetext" forces text
613 mode. "forceweb" forces web mode. "forcenone" tells Debug::Showstuff
614 that you don't want to force either mode.
615
616 inweb
617 Returns a guess on if we're in a web environment. The guess is pretty
618 simple: if the environment variable "REQUEST_URI" is true (in the
619 Perlish sense) then this function returns true.
620
621 If the global $Debug::ShowStuff::forceenv is defined, this function
622 returns the value of $Debug::ShowStuff::forceenv.
623
624 output_to_file($path)
625 Sends Debug::ShowStuff output to a file instead of to STDOUT or STDERR.
626 The value of this function must be assigned to a variable or it has no
627 effect. Don't do anything with the returned value... it is NOT a file
628 handle. The returned value is an object that, when it goes out of
629 scope, closes the output file handle.
630
631 For example, the following code will output to three files names
632 Larry.txt, Curly.txt, and Moe.txt:
633
634 foreach my $name (qw[Larry Curyl Moe]) {
635 my $output = output_to_file("$name.txt");
636 println $name;
637 println 'length: ', length($name);
638 }
639
640 setoutput
641 Sets the default output handle. By default, routines in
642 "Debug::ShowStuff" output to STDOUT. With this command you can set the
643 default output to STDERR, back to STDOUT, to a filehandle you specify,
644 or to a Debug::ShowStuff::SeparatePrint file handle.
645
646 The following command sets default output to STDERR:
647
648 setoutput 'stderr';
649
650 This command sets output back to STDOUT:
651
652 setoutput 'stdout';
653
654 This command sends output to a file handle of your choice:
655
656 setoutput $fh;
657
658 This command sends output to a Debug::ShowStuff::SeparatePrint file
659 handle. This option is a good way to create a simple log file. When
660 you print to this type of file handle, the file is opened separately
661 just for that write, an exclusive lock on the file is obtained, and the
662 end of the file is sought.
663
664 Note that the next parameter must be the path to the output file:
665
666 setoutput 'separateprint', $file_path;
667
668 option: new
669
670 If the "new" parameter is true, then the output file is open in non-
671 append mode, which means any existing contents are removed.
672
673 fixundef
674 Takes a single argument. If that argument is undefined, returns an
675 empty string. Otherwise returns the argument exactly as it is.
676
677 findininc
678 Given one or more file names, searches @INC for where they are located.
679 Returns an array of full file names.
680
681 showtainted(@values)
682 Given an array of values, shows which are tainted and which are not.
683 If the first argument is a hashref, displays the tainted status of each
684 element value.
685
686 showsth
687 Outputs a table of all rows in the given DBI statement handle. Note
688 that this function "uses up" the statement handle.
689
690 showsql
691 showsql output the results of an SQL statement. showsql takes three
692 parameters: the database handle, the SQL statement, and an array-ref of
693 parameters for the SQL statement.
694
695 explainsql
696 explainsql outputs the result of an SQL EXPLAIN call. This function
697 works much like showsql. The parameters are the database handle, the
698 SQL statement, and an array-ref of SQL parameters. explainsql prepends
699 "EXPLAIN ANALYZE" to your SQL, runs the statement, then outputs the
700 results.
701
702 I have only used explainsql with PostGresql. I would be interested
703 hear about how it works with other database management systems and how
704 it might be improved to work in those environments.
705
706 tempshowstuff
707 Temporarily turn showstuff on or off. Create a variable in the lexical
708 scope where you want the tempoary change, like this:
709
710 my $temp = tempshowstuff(1)
711
712 When the variable goes out of scope, showstuff will revert back to its
713 previous state.
714
715 showisa
716 Outputs the ISA hierarchy of an object or class. For example, the
717 following code outputs the ISA hierarchy for a Xapat object (Xapat is a
718 web server written in Perl and which uses Net::Server).
719
720 $xapat = Xapat->new(%opts);
721 showisa $xapat;
722
723 which outputs:
724
725 ------------------------------------
726 Xapat
727 Net::Server::HTTP
728 Net::Server::MultiType
729 Net::Server
730 ------------------------------------
731
732 Note that showisa loads Class::ISA, which is available on CPAN.
733
734 timer
735 This function is for when you want to display how long it took for your
736 code to run. Assign the return value of this function to a variable.
737 When the variable goes out of scope then the difference between the
738 start and end time is displayed in seconds. For example, the following
739 code:
740
741 do {
742 my $timer = timer();
743 sleep 3;
744 };
745
746 outputs this:
747
748 start timer
749 duration: 3 seconds
750
751 option: title
752
753 If you send the "title" option, then that title will be displayed with
754 the beginning and ending output. For example, this code:
755
756 do {
757 my $timer = timer(title=>'my block');
758 sleep 3;
759 };
760
761 produces this output:
762
763 start timer - my block
764 duration - my block: 3 seconds
765
766 method: $timer->elapsed
767
768 Returns the difference between when the timer was started and the
769 current time.
770
771 method: $timer->silence
772
773 Turns off the timer so that it doesn't display anything when it dies.
774
776 Copyright (c) 2010-2013 by Miko O'Sullivan. All rights reserved. This
777 program is free software; you can redistribute it and/or modify it
778 under the same terms as Perl itself. This software comes with NO
779 WARRANTY of any kind.
780
782 Miko O'Sullivan miko@idocs.com
783
785 Version 1.00 May 29, 2003
786 Initial public release.
787
788 Version 1.01 May 29, 2003
789 Setting sort order of hash keys to case insensitive.
790
791 Version 1.10 Nov 6, 2010
792 After seven years, decided to update the version on CPAN.
793
794 Version 1.11 Nov 13, 2010
795 Fixed prerequisite requirement for MemHandle and Taint. Added
796 timer() functions. Some minor documentation fixes and tidying up.
797
798 Version 1.12 Nov 29, 2010
799 Changing from using Taint module, which has had a lot of problems,
800 to Scalar::Util, which is more (but not completely) stable.
801
802 Version 1.13 Dec 1, 2010
803 Fixed bug in prerequisites for Scalar::Util.
804
805 Version 1.14 February 23, 2013
806 Added showsth, showsql, and explainsql. Added the separateprint
807 option to setoutput. Tidied up documentation. Fixed problems with
808 prerequisites. Probably added many other features since the last
809 time I uploaded this module, but can't remember tham all.
810
811
812
813perl v5.32.0 2020-07-28 Debug::ShowStuff(3)