Beefy Boxes and Bandwidth Generously Provided by pair Networks
Pathologically Eclectic Rubbish Lister
 
PerlMonks  

Use variable as a module during runtime.

by yoda54 (Monk)
on Oct 21, 2012 at 02:16 UTC ( [id://1000164]=perlquestion: print w/replies, xml ) Need Help??

yoda54 has asked for the wisdom of the Perl Monks concerning the following question:

Monks,

I'd like to load a contents of a file to a variable then "use it" as a module during runtime. Is that possible?

Thanks for any help!

open(F, $_); my $f = do { local $/; <F> }; close(F); "use or load" $f as a module, perhaps eval somehow?

Replies are listed 'Best First'.
Re: Use variable as a module during runtime.
by Athanasius (Archbishop) on Oct 21, 2012 at 02:35 UTC

    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

      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

Re: Use variable as a module during runtime.
by NetWallah (Canon) on Oct 21, 2012 at 02:36 UTC
    Yes - it is certainly possible.

    Why don't you try it, and let us know what problems you encounter.

                 "By three methods we may learn wisdom: First, by reflection, which is noblest; Second, by imitation, which is easiest; and third by experience, which is the bitterest."           -Confucius

Re: Use variable as a module during runtime.
by tobyink (Canon) on Oct 21, 2012 at 08:16 UTC
    my $string = <<'STRING'; package Foo; sub new { bless [] => shift } sub foo { print "foo!\n" } STRING eval $string; my $foo = Foo->new; $foo->foo;
    perl -E'sub Monkey::do{say$_,for@_,do{($monkey=[caller(0)]->[3])=~s{::}{ }and$monkey}}"Monkey say"->Monkey::do'
      Thanks!
Re: Use variable as a module during runtime.
by sundialsvc4 (Abbot) on Oct 22, 2012 at 13:53 UTC

    Consider perldoc -f require.

    A far more thorough approach:   UNIVERSAL::require.

    Consider also the source-code found in RPC::Any::Server.   Here is a system that is designed to invoke packages and (selected... controllable...) methods within them.   It should be a good source of ideas.

Log In?
Username:
Password:

What's my password?
Create A New User
Domain Nodelet?
Node Status?
node history
Node Type: perlquestion [id://1000164]
Approved by Athanasius
help
Chatterbox?
and the web crawler heard nothing...

How do I use this?Last hourOther CB clients
Other Users?
Others imbibing at the Monastery: (6)
As of 2024-04-23 15:42 GMT
Sections?
Information?
Find Nodes?
Leftovers?
    Voting Booth?

    No recent polls found