Perl `使用`包范围:如何使其跨文件?

Perl `使用`包范围:如何使其跨文件?,perl,Perl,在scriptA.pl中,有use DBI 在scriptB.pl中,有要求“scriptA.pl” 但是我们仍然不能在scriptB.pl foo "from scriptA"; foo "from scriptB"; 除了在scriptB.pl中重复使用DBI?有很多方法,但它们都比简单地键入使用DBI更难看、更粗糙、更不干净在每个使用它的文件中。这是最佳实践,也是很正常的。的作用域特性是有文档记录的功能: 使用模块 将一些语义从命名模块导入到当前包中,通常是通过在包中别名某些子例程或变

scriptA.pl
中,有
use DBI

scriptB.pl
中,有
要求“scriptA.pl”

但是我们仍然不能在
scriptB.pl

foo "from scriptA";
foo "from scriptB";

除了在
scriptB.pl
中重复
使用DBI

有很多方法,但它们都比简单地键入
使用DBI更难看、更粗糙、更不干净在每个使用它的文件中。这是最佳实践,也是很正常的。

的作用域特性是有文档记录的功能:

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

你可以像下面的例子那样回到石器时代,做你想做的事情,但请不要这样做

使用
MyModule
作为
DBI
的替代:

package MyModule;

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

1;
然后从
scriptA.pl

foo "from scriptA";
foo "from scriptB";
scriptB.pl

foo "from scriptA";
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. 来自scriptA! 来自scriptB! 完成。 您也可以在讨厌的
eval
游戏中禁用作用域安全功能,但请不要这样做

如果您的设计需要改进,那么
scriptA
scriptB
可能属于同一个软件包,这将是对您时间的更好投资。否则,咬紧牙关,花费九次击键


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

我想知道您想要实现什么

如果您只是想减少样板代码(在每个文件中使用15个常见的
use Foo
声明),您可以使用一个模块来创建一组标准的模块来使用:

把这个放到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.

什么症状使您说不能在scriptB.pl中使用DBI包?