B::Concise -- an improved replacement for B::Terse
[p5sagit/p5-mst-13.2.git] / ext / B / B / Showlex.pm
CommitLineData
a798dbf2 1package B::Showlex;
2use strict;
3use B qw(svref_2object comppadlist class);
4use B::Terse ();
5
6#
7# Invoke as
8# perl -MO=Showlex,foo bar.pl
9# to see the names of lexical variables used by &foo
10# or as
11# perl -MO=Showlex bar.pl
12# to see the names of file scope lexicals used by bar.pl
13#
14
15sub showarray {
16 my ($name, $av) = @_;
17 my @els = $av->ARRAY;
18 my $count = @els;
19 my $i;
20 print "$name has $count entries\n";
21 for ($i = 0; $i < $count; $i++) {
22 print "$i: ";
23 $els[$i]->terse;
24 }
25}
26
27sub showlex {
28 my ($objname, $namesav, $valsav) = @_;
29 showarray("Pad of lexical names for $objname", $namesav);
30 showarray("Pad of lexical values for $objname", $valsav);
31}
32
33sub showlex_obj {
34 my ($objname, $obj) = @_;
35 $objname =~ s/^&main::/&/;
36 showlex($objname, svref_2object($obj)->PADLIST->ARRAY);
37}
38
39sub showlex_main {
40 showlex("comppadlist", comppadlist->ARRAY);
41}
42
43sub compile {
44 my @options = @_;
45 if (@options) {
46 return sub {
47 my $objname;
48 foreach $objname (@options) {
49 $objname = "main::$objname" unless $objname =~ /::/;
50 eval "showlex_obj('&$objname', \\&$objname)";
51 }
52 }
53 } else {
54 return \&showlex_main;
55 }
56}
57
581;
7f20e9dd 59
60__END__
61
62=head1 NAME
63
64B::Showlex - Show lexical variables used in functions or files
65
66=head1 SYNOPSIS
67
68 perl -MO=Showlex[,SUBROUTINE] foo.pl
69
70=head1 DESCRIPTION
71
72When a subroutine name is provided in OPTIONS, prints the lexical
73variables used in that subroutine. Otherwise, prints the file-scope
74lexicals in the file.
75
76=head1 AUTHOR
77
78Malcolm Beattie, C<mbeattie@sable.ox.ac.uk>
79
80=cut