Как загрузить кучу модулей perl в perl script

Это то, что я хочу сделать:

В каждом script я создаю/разрабатываю, я всегда вызываю библиотеки perl и подпрограммы, такие как:


#! /directory/bin/perl
system('source /directory/.cshrc&');

use Net::Domain qw(hostname hostfqdn hostdomain);
use Time::Local;
use Time::Piece;
use Switch;
use Exporter;
#use strict;

use Data::Dumper qw(Dumper);

use Time::Local;                                        
use Time::Piece; 
use Time::Seconds();                                       

use Tk;
use Tk::BrowseEntry; 
use Tk::Balloon;                                   
use Tk::widgets qw(Checkbutton BrowseEntry);            
use Tk::NoteBook;                                       
use Tk::Pane;                                           

use DBI;
use DBD::Oracle;
$ORACLE_HOME = "/lolDirectory/10.2.0/elinux";    
$ENV{ORACLE_HOME}=$ORACLE_HOME; 

###############
# SUBROUTINES #
###############

&ownerChecker;
&processChecker;    

Я хочу, чтобы я мог поместить все это в файл и загрузить его в perl script, в то же время запуская его, как будто он является частью самого perl script, например:


#! /directory/bin/perl

# load the content of the file and run it as a part of the script

Возможно ли это? Если это возможно? Если это возможно, от вызова вызовов libs к вызывающим скриптам могут быть очень общие и стандартные.

Ответ 1

Создание одного модуля, который загружает другие "стандартные" модули, является мотивацией для таких вещей, как perl5i и Modern::Perl.

Модули Pragma с лексическим эффектом, такие как строгие, предупреждения и autodie, просто должны быть загружены в процедуру импорта модуля. Модулям, которые экспортируют функции, нужно сказать, чтобы экспортировать их модули в другом месте, что можно сделать с помощью Import::Into. Наконец, классы просто необходимо загрузить.

Так как use происходит во время компиляции, вам нужно выполнить эквивалент во время выполнения, который является require модуля и вызывает его метод import.

Вот пример включения строгих правил и предупреждений, загрузка Time:: Local и загрузка Time:: Piece, а также активизация функций say и switch.

package My::Perl;

use strict;
use warnings;
use Import::Into;

sub import {
    # import is called as a class method
    my $class = shift;

    # The class which 'use'd this module
    my $caller = caller;

    # same as "use strict" but happens when import() is called.
    require strict;
    "strict"->import;

    # use warnings;
    require warnings;
    "warnings"->import;

    # use Time::Local;
    # use Time::Piece;
    Time::Local->import::into($caller);
    Time::Piece->import::into($caller);

    # use feature qw(say switch);
    require feature;
    feature->import(qw(say switch));
}

1;

Теперь вам просто нужно загрузить этот один модуль.

use My::Perl;

say localtime->year;

Не сходите с ума, вы хотите, чтобы они были в целом полезными. Глупо загружать DBI и Tk, если вы не собираетесь их использовать. Если вы хотите загрузить кучу модулей Tk, сделайте для этого отдельный модуль My:: Tk. И я бы не хотел, чтобы модули выполняли какой-либо код по той же причине.