`use`包范围:如何让它跨文件?

pow*_*boy 5 perl

scriptA.pl,有use DBI

scriptB.pl,有require "scriptA.pl"

但我们仍然无法使用DBI包 scriptB.pl

任何方法来处理这除了重复 use DBIscriptB.pl

Eth*_*her 8

有方法,但它们比简单地输入use DBI;使用它的每个文件更丑陋,更丑陋和不洁净.这是最好的做法,很正常.


Gre*_*con 8

范围性质use是一个记录的功能:

use Module

从命名模块将一些语义导入当前包,通常通过将某些子例程或变量名称别名到包中.

你可以通过回到石器时代做你想做的事,如下例所示,但请不要.

使用MyModule作为一个独立的为DBI:

package MyModule;

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

1;
Run Code Online (Sandbox Code Playgroud)

然后打电话MyModule::fooscriptA.pl

foo "from scriptA";
Run Code Online (Sandbox Code Playgroud)

scriptB.pl

foo "from scriptB";
Run Code Online (Sandbox Code Playgroud)

全部从一个主要计划开始

#! /usr/bin/perl

use warnings;
use strict;

use MyModule;

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

print "done.\n";
Run Code Online (Sandbox Code Playgroud)

给出以下输出:

from scriptA!
from scriptB!
done.

您还可以通过讨厌的eval游戏禁用范围安全功能,但请不要这样做.

如果您的设计需要改进,也许scriptAscriptB在同一个属于包,这将是你的时间远远更好的投资.否则,咬紧牙关并花费九次击键.

请注意,在运行时通过do或是require严格过时的方法执行Perl库.该perlmod的文档描述了现代的方法.