http://www.perlmonks.org?node_id=1000165


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 'my_file.pl';

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!

    Regards.

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

      $f->new

      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 “Widget.pm”:

      #! 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 Widget.pm):

      #! perl use strict; use warnings; use autodie; open(my $fh, '<', 'Widget.pm'); 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!