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

时间:2010-08-15 01:44:54

标签: perl

scriptA.pl中,有use DBI

scriptB.pl中,有require "scriptA.pl"

但我们仍然无法在scriptB.pl

中使用DBI包

除了在use DBI中重复scriptB.pl之外,还有办法解决这个问题吗?

3 个答案:

答案 0 :(得分:8)

有一些方法,但它们比在每个使用它的文件中键入use DBI;更丑陋,更丑陋和不洁净。这是最好的做法,很正常。

答案 1 :(得分:8)

use的范围性质是一个记录在案的特征:

  

<强> use Module

     

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

你可以按照下面的例子回到石器时代做你想做的事,但请不要。

使用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游戏禁用作用域安全功能,但请不要这样做。

如果您的设计需要改进 - 可能scriptAscriptB属于同一个套餐 - 这将是您更好的投资时间。否则,咬紧牙关并花费九次击键。

请注意,通过dorequire在运行时执行Perl库是一种严重过时的方法。 perlmod文档描述了现代方法。

答案 2 :(得分:2)

我发现自己想知道你想要实现的是什么?

如果您只想减少样板代码(每个文件中有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.