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


in reply to Re^2: Use variable as a module during runtime.
in thread Use variable as a module during runtime.

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

Replies are listed 'Best First'.
Re^4: Use variable as a module during runtime.
by ysth (Canon) on Oct 22, 2012 at 01:40 UTC
    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.

Re^4: Use variable as a module during runtime.
by yoda54 (Monk) on Oct 22, 2012 at 23:41 UTC
    Thank you very much!