in reply to Use 'use' in foreach

And I am able to install these modules ... The only problem is that I can't 'use' them afterwards.

If you can install them (using one of the many ways, cpan, cpanm, perl Makefile.PL && make && make test && make install, ppm, ...) then you should be able to use them. Otherwise, you may have installed them in a different location than your perl expects, this might happen, for example, if you have two versions of Perl installed.

Note that since use has a compile-time effect, it doesn't make sense to put it in a foreach. If you want to have the advantages of that compile-time effect, like e.g. not having to use parentheses on imported functions, then the list of modules has to be known at compile time, so it's unclear to me why you don't just write use Foo::Bar; use Bar::Foo;.

Loading modules at runtime can be achieved in other ways. For example, require Foo::Bar; Foo::Bar->import; or my $modulename = "Foo::Bar"; eval "use $modulename; 1" or die $@; (Update before posting: Or e.g. Module::Load, as hippo showed).

Update: If you are still having trouble, please show us an SSCCE so we can try to reproduce the problem on our end, plus the error messages you're getting. See also How do I post a question effectively?

Replies are listed 'Best First'.
Re^2: Use 'use' in foreach
by zidi (Acolyte) on Jul 20, 2017 at 08:33 UTC
    Thanks for the long answere. I have one array with all non core modules I need for the execution of the script. If eval "use $_" fails, the module gets pushed into the second array — @NotInstalledModules. The script then installs all @NotInstalledModules via cpanm. eval "use $_" was the last missing part of the puzzle after the installation.

      Personally, I would look at splitting the script into two scripts and using the standard Perl installation approach, but I understand if you want to make things as easy as possible for the user.

      The standard installation approach would be to list all the modules your program needs in Makefile.PL and then just use cpanm --installdeps . to install all the modules your script needs automatically.

      This has the drawback that you need a second file with your script, but the huge advantage that your installation process now also works with cpan and almost all other, and future installation processes for Perl stuff.

      A very simplicistic Makefile.PL would look like the following:

      #!perl -w use ExtUtils::MakeMaker; our %module = ( NAME => 'myscript, AUTHOR => q{zidi <zidi@example.com>}, PREREQ_PM => { 'strict' => 0, ... }, ); if(! caller()) { WriteMakefile( %module ); }; 1;
        Thanks for taking your time. That's actually how I install my @NotInstalledDependencies after the user agrees to. The only difference is that I create the cpanfile, execute it and delete it within my script. I am new to Perl and in this project I want to do as much as possible within one workflow-script and learn by doing.