Beefy Boxes and Bandwidth Generously Provided by pair Networks
Think about Loose Coupling

Re: Use variable as a module during runtime.

by Athanasius (Chancellor)
on Oct 21, 2012 at 02:35 UTC ( #1000165=note: print w/replies, xml ) Need Help??

in reply to Use variable as a module during runtime.

You don’t need to load the file to a variable first. Just use do directly on the file:

do '';

and that “executes the contents of the file as a Perl script.”

Update (in reply to Reaped: Re^2: Use variable as a module during runtime. below): If you want to use the variable, then just use eval on it:

eval $f; warn $@ if $@;

But note what the documentation says regarding scope:

The value of the expression (which is itself determined within scalar context) is first parsed, and if there were no errors, executed as a block within the lexical context of the current Perl program. This means, that in particular, any outer lexical variables are visible to it, and any package variable settings or subroutine and format definitions remain afterwards.

Hope that helps,

Athanasius <°(((><contra mundum

Replies are listed 'Best First'.
Re^2: Use variable as a module during runtime.
by yoda54 (Monk) on Oct 21, 2012 at 03:11 UTC
    So after that, I can do stuff like "my $object = $f->new ?"

    I get errors like: Can't locate object method "test" via package "package Test.

    Thanks for the help!


      In your original code, $f was a variable holding the whole code of the module as a string. So of course


      would produce syntax errors! You need to replace $f with whatever name you gave the module, i.e., the name you used in the package declaration.

      Here is an example to show how this works:

      (1) File “”:

      #! perl use strict; use warnings; package Widget; sub new { my ($class, $name) = @_; my %self = (name => $name); bless \%self, $class; } sub say_hello { my ($self) = @_; print "$self->{name} says \"Hello!\"\n"; } 1;

      (2) The main .pl script (in the same directory as

      #! perl use strict; use warnings; use autodie; open(my $fh, '<', ''); my $f = do { local $/; <$fh> }; close $fh; eval $f; warn $@ if $@; my $widget = Widget->new('Gromit'); $widget->say_hello();

      When I run this, I get:

      Gromit says "Hello!"

      as expected.

      Athanasius <°(((><contra mundum

        In your original code, $f was a variable holding the whole code of the module as a string.

        That was your assumption. The other possibility is that the file contained something like "Module::Name". yoda54 would need to provide example data to know for sure.

        Update: oh, I see from the partial error message in the grandparent of this node that you are indeed correct. Sorry for the noise.

        Thank you very much!

Log In?

What's my password?
Create A New User
Node Status?
node history
Node Type: note [id://1000165]
[perldigious]: No offense to any Scotsman, I love Scots. Well actually, I love Scotch, but I'm sure the people are great too. :-P
[Discipulus]: perldigious i understand i word on ten, to be optimistic..
LanX will try to give his next LPW talk with a Cogney intonation
[Discipulus]: if you love Scotch in scotland your safety will be.. glengranted
[LanX]: *Cockney
erix tries for a few glo'al stops
[Discipulus]: or was Cognac (in|s)tonation?

How do I use this? | Other CB clients
Other Users?
Others studying the Monastery: (7)
As of 2017-06-23 16:53 GMT
Find Nodes?
    Voting Booth?
    How many monitors do you use while coding?

    Results (552 votes). Check out past polls.