81 lines
1.5 KiB
Perl
81 lines
1.5 KiB
Perl
package B::Showlex;
|
|
use strict;
|
|
use B qw(svref_2object comppadlist class);
|
|
use B::Terse ();
|
|
|
|
#
|
|
# Invoke as
|
|
# perl -MO=Showlex,foo bar.pl
|
|
# to see the names of lexical variables used by &foo
|
|
# or as
|
|
# perl -MO=Showlex bar.pl
|
|
# to see the names of file scope lexicals used by bar.pl
|
|
#
|
|
|
|
sub showarray {
|
|
my ($name, $av) = @_;
|
|
my @els = $av->ARRAY;
|
|
my $count = @els;
|
|
my $i;
|
|
print "$name has $count entries\n";
|
|
for ($i = 0; $i < $count; $i++) {
|
|
print "$i: ";
|
|
$els[$i]->terse;
|
|
}
|
|
}
|
|
|
|
sub showlex {
|
|
my ($objname, $namesav, $valsav) = @_;
|
|
showarray("Pad of lexical names for $objname", $namesav);
|
|
showarray("Pad of lexical values for $objname", $valsav);
|
|
}
|
|
|
|
sub showlex_obj {
|
|
my ($objname, $obj) = @_;
|
|
$objname =~ s/^&main::/&/;
|
|
showlex($objname, svref_2object($obj)->PADLIST->ARRAY);
|
|
}
|
|
|
|
sub showlex_main {
|
|
showlex("comppadlist", comppadlist->ARRAY);
|
|
}
|
|
|
|
sub compile {
|
|
my @options = @_;
|
|
if (@options) {
|
|
return sub {
|
|
my $objname;
|
|
foreach $objname (@options) {
|
|
$objname = "main::$objname" unless $objname =~ /::/;
|
|
eval "showlex_obj('&$objname', \\&$objname)";
|
|
}
|
|
}
|
|
} else {
|
|
return \&showlex_main;
|
|
}
|
|
}
|
|
|
|
1;
|
|
|
|
__END__
|
|
|
|
=head1 NAME
|
|
|
|
B::Showlex - Show lexical variables used in functions or files
|
|
|
|
=head1 SYNOPSIS
|
|
|
|
perl -MO=Showlex[,SUBROUTINE] foo.pl
|
|
|
|
=head1 DESCRIPTION
|
|
|
|
When a subroutine name is provided in OPTIONS, prints the lexical
|
|
variables used in that subroutine. Otherwise, prints the file-scope
|
|
lexicals in the file.
|
|
|
|
=head1 AUTHOR
|
|
|
|
Malcolm Beattie, C<mbeattie@sable.ox.ac.uk>
|
|
|
|
=cut
|