“Symbol Tables” has always been a tough chapter because it’s the part of the book where I have the least experience, I think. I’m not strong on Perl internals and don’t have to think about symbol tables so much; my terminology is a bit soft and pudgey here.
For the most part, the chapter is the same without major changes. I use the word “stash” much more, flesh out some examples, and show the output of more programs.
I made a mistake in the previous edition. I had a subroutine that would check for that a package variable had been used somewhere in the program. I can do that with something like:
print "Used!\n" if *foo{ARRAY};
The typeglob will return a reference to the data for that variable, and references are always true values. If @foo
hasn’t been used (so, no data yet, even if it’s the empty list), this returns undef. It returns true even if I’ve undef
-ed the array; I’ve still used the array already in that case.
However, for scalars, it always returns a reference. It even returns a reference in the case that the scalar of that name has not ever been used or seen. The means *foo{SCALAR}
is true for all names all the time. perlref says:
*foo{THING}
returns undef if that particular THING hasn’t been used yet, except in the case of scalars.*foo{SCALAR}
returns a reference to an anonymous scalar if $foo hasn’t been used yet. This might change in a future release.
Besides that, I made adjustments for imprecisions in my previous explanations and terms. I could use a good set of tech reviewers on it still.
At the end of the chapter, after showing all of the complicated stuff, I show Package::Stash, which mostly makes it easier to do the really hard stuff.
Check out this chapter in O’Reilly Atlas.