Hi all,

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

Title:
Use:  <p> text here (a paragraph) </p>
and:  <code> code here </code>
to format your post, it's "PerlMonks-approved HTML":



  • Posts are HTML formatted. Put <p> </p> tags around your paragraphs. Put <code> </code> tags around your code and data!
  • Titles consisting of a single word are discouraged, and in most cases are disallowed outright.
  • Read Where should I post X? if you're not absolutely sure you're posting in the right place.
  • Please read these before you post! —
  • Posts may use any of the Perl Monks Approved HTML tags:
    a, abbr, b, big, blockquote, br, caption, center, col, colgroup, dd, del, details, div, dl, dt, em, font, h1, h2, h3, h4, h5, h6, hr, i, ins, li, ol, p, pre, readmore, small, span, spoiler, strike, strong, sub, summary, sup, table, tbody, td, tfoot, th, thead, tr, tt, u, ul, wbr
  • You may need to use entities for some characters, as follows. (Exception: Within code tags, you can put the characters literally.)
            For:     Use:
    & &amp;
    < &lt;
    > &gt;
    [ &#91;
    ] &#93;
  • Link using PerlMonks shortcuts! What shortcuts can I use for linking?
  • See Writeup Formatting Tips and other pages linked from there for more info.