Область применения `use`: как сделать так, чтобы файлы пересекались? - PullRequest
5 голосов
/ 15 августа 2010

В scriptA.pl есть use DBI

В scriptB.pl есть require "scriptA.pl"

Но мы все еще не можем использовать пакет DBI в scriptB.pl

Любой способ справиться с этим, кроме повторения use DBI в scriptB.pl?

Ответы [ 3 ]

8 голосов
/ 15 августа 2010

Характер области действия use является документированной функцией:

use Module

Импортирует некоторую семантику втекущий пакет из названного модуля, обычно путем псевдонимов определенных подпрограмм или имен переменных в вашем пакете.

Вы можете сделать то, что вы хотите, вернувшись к каменному веку, как в следующем примере, но, пожалуйста,'t.

Использование MyModule в качестве замены для DBI:

package MyModule;

use Exporter 'import';
our @EXPORT = qw/ foo /;
sub foo { print "$_[0]!\n" }

1;

, а затем вызов MyModule::foo из scriptA.pl

foo "from scriptA";

и из scriptB.pl

foo "from scriptB";

все запускается из основной программы

#! /usr/bin/perl

use warnings;
use strict;

use MyModule;

do "scriptA.pl" or die;
do "scriptB.pl" or die;

print "done.\n";

и дает следующий вывод:

from scriptA!
from scriptB!
done.

Вы также можете отключитьфункция обеспечения безопасности при работе с неприятными eval играми, но, пожалуйста, тоже не делайте этого.

Если ваш дизайн нуждается в улучшении - возможно, scriptA и scriptB принадлежат к одному пакету - это будетгораздо лучшая инвестиция вашего времени.В противном случае прикусите пулю и потратьте девять нажатий клавиш.

Обратите внимание, что выполнение библиотек Perl во время выполнения с помощью do или require является серьезно устаревшим подходом.Документация perlmod описывает современный подход.

8 голосов
/ 15 августа 2010

Есть способы, но все они более уродливы, хакерские и нечистые, чем просто ввод use DBI; в каждом файле, который его использует.Это лучшая практика и вполне нормальная.

2 голосов
/ 15 августа 2010

Мне интересно, чего вы пытаетесь достичь?

Если вы просто хотите уменьшить стандартный код (15 общих use Foo объявлений в каждом файле), вы можете использовать такой модуль, как ToolKit для создания стандартного набора модулей для использования:

Поместите это в Powerboy.pm:

 package Powerboy;

 use base 'ToolSet'; 

 ToolSet->use_pragma( 'strict' );
 ToolSet->use_pragma( 'warnings' );

 ToolSet->export(
     'DBI'  => undef,  # Export the default set of symbols
 );

 1; 

А затем в ваших скриптах просто выполните:

 use Powerboy;

 # We have strict, warnings and DBI now.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...