12.6. Determining the Caller's Package12.6.2. SolutionTo find the current package: $this_pack = _ _PACKAGE_ _; $that_pack = caller( ); 12.6.3. DiscussionThe _ _PACKAGE_ _ symbol returns the package that the code is currently being compiled into. This doesn't interpolate into double-quoted strings: print "I am in package _ _PACKAGE_ _\n"; # WRONG! I am in package _ _PACKAGE_ _ Needing to figure out the caller's package arose more often in older code that received as input a string of code to be eval uated, or a filehandle, format, or directory handle name. Consider a call to a hypothetical runit function:
Because runit was compiled in a different package than was currently executing, when the eval runs, it acts as though it were passed $Beta::line and Beta::TEMP. The old workaround was to include your caller's package first:
That approach works only when $line is a global variable. If it's lexical, that won't help at all. Instead, arrange for runit to accept a reference to a subroutine:
This not only works with lexicals, but has the added benefit of checking the code's syntax at compile time, which is a major win. If all that's being passed in is a filehandle, it's more portable to use the Symbol::qualify function. This function takes a name and package to qualify the name into. If the name needs qualification, it fixes it; otherwise, it's left alone. But that's considerably less efficient than a * prototype. Here's an example that reads and returns n lines from a filehandle. The function qualifies the handle before working with it.
If everyone who called your nreadline function passed the filehandle as a typeglob *FH, as a glob reference *FH, or using FileHandle or IO::Handle objects, you wouldn't need to do this. It's only the possibility of a bare "FH" string that requires qualification. 12.6.4. See AlsoThe documentation for the standard Symbol module, also found in Chapter 32 of Programming Perl; the descriptions of the special symbols _ _FILE_ _, _ _LINE_ _, and _ _PACKAGE_ _ in perldata(1); Recipe 12.14; Recipe 7.6
Copyright © 2003 O'Reilly & Associates. All rights reserved. |
|