I have a bunch of applications using the following construct to import variables and their names into their namespaces:
package Somepackage; use Exporter; our @ISA = qw(Exporter); our @EXPORT_OK = qw($SOME_VAR); our $SOME_VAR = 123; 1; use Somepackage qw($SOME_VAR); print "It is: $SOME_VAR\n";
Now I want to generate the Somepackage class dynamically as the variables and their values will be stored in a database table from now on.
That's all easy, just generate the appropriate code in a variable and eval the generated code using eval.
This boils down to the following example:
## ## BEGIN makes available the variable $SOME_VAR, these declarations ar +e ## read from a database in reality. ## sub BEGIN { my $varName = 'SOME_VAR'; my $varValue = 123; ## ## Dynamically create the package ## my $code = qq/ package Somepackage; use Exporter; our \@ISA = qw(Exporter); our \@EXPORT_OK = qw(\$$varName); our \$$varName = $varValue; 1; /; print $code, "\n"; eval $code; ## ## Leaving out this line makes the "use Somepackage qw($SOME_VAR) +fail (Can't locate package ## Somepackage.pm in @INC ...). ## $INC{"Somepackage.pm"} = 'abc'; } ## ## Let's use it. ## use Somepackage qw($SOME_VAR); ## ## And see if it's defined. ## print "Var is $SOME_VAR\n";
The thing I somewhat worry about is that if I don't put the generated package in %INC, it doesn't work, it says: Can't locate package Somepackage.pm. If I put the package name into %INC, all is well.
However, what do I put as the value in %INC? Normally, these are filenames pointing back to the original source file. In this case, there is no physical file.
Putting some random value in it ('abc') works fine and I should be ok. Does perl ever use the actual value, expecting it to be a file and thus possibly causing havoc in my application?
Thanks, Bas.
In reply to Dynamic USE and %INC by Bas-i
| For: | Use: | ||
| & | & | ||
| < | < | ||
| > | > | ||
| [ | [ | ||
| ] | ] |