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.10 by root, Sat Apr 26 03:15:28 2008 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.2'; 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(0x7bd2d0) is 50 SCALAR(0x814ece8) is
51 in the global $Test::var. 51 +- in the global $Test::var.
52 referenced by REF(0x7bd240), which is 52 +- referenced by REF(0x814f9e4), which is
53 in the member 'ukukey2' of HASH(0x7bd228), which is
54 referenced by REF(0x81dae8), which is
55 in the lexical '$local' in CODE(0x81da88), which is 53 | in the lexical '$x' in CODE(0x814ed78), which is
54 | the containing scope for CODE(0x820c4b0), which is
56 in the global &Test::testsub. 55 | in the global &Test::testsub.
56 +- referenced by REF(0x814ed6c), which is
57 | in the member 'ukukey' of HASH(0x81da20c), which is
58 | in the global %Test::hash.
59 +- referenced by REF(0x814ec28), which is
60 | not found anywhere I looked :(
61 +- referenced by REF(0x814eb44), which is
62 in the member 'ukukey2' of HASH(0x814f99c), which is
57 referenced by REF(0x81da40), which is 63 +- referenced by REF(0x820c450), which is
64 | in the lexical '$local' in CODE(0x820c4b0), which was seen before.
65 +- referenced by REF(0x820c204), which is
58 in the global $Test::hash2. 66 in the global $Test::hash2.
59 referenced by REF(0x79f3f8), which is
60 in the lexical '$x' in CODE(0x79f518), which is
61 the containing scope for CODE(0x81da88), which is
62 in the global &Test::testsub.
63 referenced by REF(0x79f2f0), which is
64 not found anywhere I looked :(
65 referenced by REF(0x79f140), which is
66 in the member 'ukukey' of HASH(0x81d698), which is
67 in the global %Test::hash.
68 67
69It 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
70stored in C<$var> can be found: 69stored in C<$var> can be found:
71 70
72=over 4 71=over 4
107sub track { 106sub track {
108 my ($ref, $depth) = @_; 107 my ($ref, $depth) = @_;
109 @_ = (); 108 @_ = ();
110 109
111 my $buf = ""; 110 my $buf = "";
111 my %seen;
112 112
113 Scalar::Util::weaken $ref; 113 Scalar::Util::weaken $ref;
114 114
115 my $track; $track = sub { 115 my $track; $track = sub {
116 my ($refref, $depth, $indent) = @_; 116 my ($refref, $depth, $indent) = @_;
117 117
118 if ($depth) { 118 if ($depth) {
119 my (@about) = find $$refref; 119 my (@about) = find $$refref;
120 if (@about) { 120 if (@about) {
121 for my $about (@about) { 121 for my $about (@about) {
122 $buf .= (" ") x $indent; 122 $buf .= "$indent" . (@about > 1 ? "+- " : " ") . $about->[0];
123 $buf .= $about->[0];
124 if (@$about > 1) { 123 if (@$about > 1) {
124 if ($seen{$about->[1]+0}++) {
125 $buf .= " $about->[1], which was seen before.\n";
126 } else {
125 $buf .= " $about->[1], which is\n"; 127 $buf .= " $about->[1], which is\n";
126 $track->(\$about->[1], $depth - 1, $indent + 1); 128 $track->(\$about->[1], $depth - 1, $about == $about[-1] ? "$indent " : "$indent| ");
129 }
127 } else { 130 } else {
128 $buf .= ".\n"; 131 $buf .= ".\n";
129 } 132 }
130 } 133 }
131 } else { 134 } else {
132 $buf .= (" ") x $indent;
133 $buf .= "not found anywhere I looked :(\n"; 135 $buf .= "$indent not found anywhere I looked :(\n";
134 } 136 }
135 } else { 137 } else {
136 $buf .= (" ") x $indent;
137 $buf .= "not referenced within the search depth.\n"; 138 $buf .= "$indent not referenced within the search depth.\n";
138 } 139 }
139 }; 140 };
140 141
141 $buf .= "$ref is\n"; 142 $buf .= "$ref is\n";
142 $track->(\$ref, $depth || 10, 1); 143 $track->(\$ref, $depth || $ENV{PERL_DEVEL_FINDREF_DEPTH} || 10, "");
143 $buf 144 $buf
144} 145}
145 146
146=item @references = Devel::FindRef::find $ref 147=item @references = Devel::FindRef::find $ref
147 148
171 # 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:
172 my $ref_to_hash = Devel::FindRef::ptr2ref 0x176ff70; 173 my $ref_to_hash = Devel::FindRef::ptr2ref 0x176ff70;
173 174
174=back 175=back
175 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
176=head1 AUTHOR 183=head1 AUTHOR
177 184
178Marc Lehmann <pcg@goof.com>. 185Marc Lehmann <pcg@goof.com>.
179 186
180=head1 BUGS 187=head1 BUGS

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines