How can my Perl script find its module in the same directory?

后端 未结 9 1029
执念已碎
执念已碎 2020-12-23 19:26

I recently wrote a new Perl script to kill processes based on either process name / user name and extended it using Classes so that I could reuse the process code in other p

相关标签:
9条回答
  • 2020-12-23 19:42

    Take a look at Par::Packer. It creates an executable with all of the script's dependencies included. It makes distribution easy. You also could also provide your users a version of your module that can be installed on their systems. See Module::Starter for an easy way to build all of the files required to make a standard CPAN-style distribution.

    0 讨论(0)
  • 2020-12-23 19:46

    You can make perl look in any directory by using the -I flag. Here, -I stands for @INC which is the array of paths in which perl looks for modules. Using -I adds the given path to the @INC array for this execution.

    eg:

    perl -I lib bin/script.pl
    

    where lib contains the modules I want to use.

    I know that this works for perl 5. I am not at sure about other versions.

    0 讨论(0)
  • 2020-12-23 19:47

    To convert relative links to absolute and add to @INC, I normally use ex::lib. Of course, this is useful only if you plan to keep the relative locations of the script and the module identical on all machines where you plan to run your script.

    0 讨论(0)
  • 2020-12-23 19:54

    The simplest approach I found it to use FindBin module. Like this:

    use FindBin;
    use lib $FindBin::Bin;
    

    Generally I prefer to have my scripts provided in such a way that programs are in whatever/bin, and libraries are in whatever/lib

    In these situations I use a slightly more complicated approach:

    use Cwd qw(abs_path);
    use FindBin;
    use lib abs_path("$FindBin::Bin/../lib");
    

    The abs_path call is to make the @INC contain whatever/lib, and not whatever/bin/../lib - it's just a slight change, but makes reading error messages easier.

    0 讨论(0)
  • 2020-12-23 19:54

    From perlfaq8, which answers "How do I add a directory to my include path (@INC) at runtime?". There are several other answers for questions around this issue too.


    How do I add a directory to my include path (@INC) at runtime?

    Here are the suggested ways of modifying your include path, including environment variables, run-time switches, and in-code statements:

    the PERLLIB environment variable

    $ export PERLLIB=/path/to/my/dir
    $ perl program.pl
    

    the PERL5LIB environment variable

    $ export PERL5LIB=/path/to/my/dir
    $ perl program.pl
    

    the perl -Idir command line flag

    $ perl -I/path/to/my/dir program.pl
    

    the use lib pragma:

    use lib "$ENV{HOME}/myown_perllib";
    

    The last is particularly useful because it knows about machine dependent architectures. The lib.pm pragmatic module was first included with the 5.002 release of Perl.

    0 讨论(0)
  • 2020-12-23 20:00

    I am curious why the simplistic solution

    use File::Basename;
    use lib dirname (__FILE__);
    use SomeModuleLocatedInTheSameDirectoryAsThisPerlScriptOrModule;
    

    did not come up. The FindBin module seems to have some issues if the file is not the main executable perl script, but simply a non-executable Perl module. At least that's how I interpret the comment in the documentation. Did not really test it.

    To have any other path relative to the location of this Perl file, do something like

    use File::Basename;
    use lib dirname (__FILE__) . "/MyModules";
    
    0 讨论(0)
提交回复
热议问题