ViewVC Help
View File | Revision Log | Show Annotations | Download File
/cvs/Devel-FindRef/FindRef.pm
(Generate patch)

Comparing Devel-FindRef/FindRef.pm (file contents):
Revision 1.9 by root, Sat Dec 29 21:04:46 2007 UTC vs.
Revision 1.13 by root, Fri Jul 11 22:18:10 2008 UTC

4 4
5use XSLoader; 5use XSLoader;
6use Scalar::Util; 6use Scalar::Util;
7 7
8BEGIN { 8BEGIN {
9 our $VERSION = '1.1'; 9 our $VERSION = '1.3';
10 XSLoader::load __PACKAGE__, $VERSION; 10 XSLoader::load __PACKAGE__, $VERSION;
11} 11}
12 12
13=head1 NAME 13=head1 NAME
14 14
15Devel::FindRef - where is that reference to my scalar hiding? 15Devel::FindRef - where is that reference to my variable hiding?
16 16
17=head1 SYNOPSIS 17=head1 SYNOPSIS
18 18
19 use Devel::FindRef; 19 use Devel::FindRef;
20 20
45 testsub; 45 testsub;
46 46
47The output is as follows (or similar to this, in case I forget to update 47The output is as follows (or similar to this, in case I forget to update
48the manpage after some changes): 48the manpage after some changes):
49 49
50 SCALAR(0x676fa0) is 50 SCALAR(0x814ece8) is
51 +- in the global $Test::var.
51 referenced by REF(0x676fb0), which is 52 +- referenced by REF(0x814f9e4), which is
52 in the lexical '$x' in CODE(0x676370), which is 53 | in the lexical '$x' in CODE(0x814ed78), which is
53 not found anywhere I looked :( 54 | the containing scope for CODE(0x820c4b0), which is
55 | in the global &Test::testsub.
54 referenced by REF(0x676360), which is 56 +- referenced by REF(0x814ed6c), which is
55 in the member 'ukukey' of HASH(0x756660), which is 57 | in the member 'ukukey' of HASH(0x81da20c), which is
56 in the global %Test::hash. 58 | in the global %Test::hash.
57 in the global $Test::var.
58 referenced by REF(0x6760e0), which is 59 +- referenced by REF(0x814ec28), which is
60 | not found anywhere I looked :(
61 +- referenced by REF(0x814eb44), which is
59 in the member 'ukukey2' of HASH(0x676f30), which is 62 in the member 'ukukey2' of HASH(0x814f99c), which is
60 referenced by REF(0x77bcf0), which is 63 +- referenced by REF(0x820c450), which is
61 in the lexical '$local' in CODE(0x77bcb0), which is 64 | in the lexical '$local' in CODE(0x820c4b0), which was seen before.
62 in the global &Test::testsub.
63 referenced by REF(0x77bc80), which is 65 +- referenced by REF(0x820c204), which is
64 in the global $Test::hash2. 66 in the global $Test::hash2.
65
66 67
67It is a bit convoluted to read, but basically it says that the value 68It is a bit convoluted to read, but basically it says that the value
68stored in C<$var> can be found: 69stored in C<$var> can be found:
69 70
70=over 4 71=over 4
105sub track { 106sub track {
106 my ($ref, $depth) = @_; 107 my ($ref, $depth) = @_;
107 @_ = (); 108 @_ = ();
108 109
109 my $buf = ""; 110 my $buf = "";
111 my %seen;
110 112
111 Scalar::Util::weaken $ref; 113 Scalar::Util::weaken $ref;
112 114
113 my $track; $track = sub { 115 my $track; $track = sub {
114 my ($refref, $depth, $indent) = @_; 116 my ($refref, $depth, $indent) = @_;
115 117
116 if ($depth) { 118 if ($depth) {
117 my (@about) = find $$refref; 119 my (@about) = find $$refref;
118 if (@about) { 120 if (@about) {
119 for my $about (@about) { 121 for my $about (@about) {
120 $buf .= (" ") x $indent; 122 $buf .= "$indent" . (@about > 1 ? "+- " : " ") . $about->[0];
121 $buf .= $about->[0];
122 if (@$about > 1) { 123 if (@$about > 1) {
124 if ($seen{$about->[1]+0}++) {
125 $buf .= " $about->[1], which was seen before.\n";
126 } else {
123 $buf .= " $about->[1], which is\n"; 127 $buf .= " $about->[1], which is\n";
124 $track->(\$about->[1], $depth - 1, $indent + 1); 128 $track->(\$about->[1], $depth - 1, $about == $about[-1] ? "$indent " : "$indent| ");
129 }
125 } else { 130 } else {
126 $buf .= ".\n"; 131 $buf .= ".\n";
127 } 132 }
128 } 133 }
129 } else { 134 } else {
130 $buf .= (" ") x $indent;
131 $buf .= "not found anywhere I looked :(\n"; 135 $buf .= "$indent not found anywhere I looked :(\n";
132 } 136 }
133 } else { 137 } else {
134 $buf .= (" ") x $indent;
135 $buf .= "not referenced within the search depth.\n"; 138 $buf .= "$indent not referenced within the search depth.\n";
136 } 139 }
137 }; 140 };
138 141
139 $buf .= "$ref is\n"; 142 $buf .= "$ref is\n";
140 $track->(\$ref, $depth || 10, 1); 143 $track->(\$ref, $depth || $ENV{PERL_DEVEL_FINDREF_DEPTH} || 10, "");
141 $buf 144 $buf
142} 145}
143 146
144=item @references = Devel::FindRef::find $ref 147=item @references = Devel::FindRef::find $ref
145 148
169 # we know that HASH(0x176ff70) exists, so turn it into a hashref: 172 # we know that HASH(0x176ff70) exists, so turn it into a hashref:
170 my $ref_to_hash = Devel::FindRef::ptr2ref 0x176ff70; 173 my $ref_to_hash = Devel::FindRef::ptr2ref 0x176ff70;
171 174
172=back 175=back
173 176
177=head1 ENVIRONMENT VARIABLES
178
179You can set the environment variable C<PERL_DEVEL_FINDREF_DEPTH> to an
180integer to override the default depth in C<track>. If a call explicitly
181specified a depth it is not overridden.
182
174=head1 AUTHOR 183=head1 AUTHOR
175 184
176Marc Lehmann <pcg@goof.com>. 185Marc Lehmann <pcg@goof.com>.
177 186
178=head1 BUGS 187=head1 BUGS

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines