在scriptA.pl
中,有use DBI
在scriptB.pl
中,有require "scriptA.pl"
但我们仍然无法在scriptB.pl
除了在use DBI
中重复scriptB.pl
之外,还有办法解决这个问题吗?
答案 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
游戏禁用作用域安全功能,但请不要这样做。
如果您的设计需要改进 - 可能scriptA
和scriptB
属于同一个套餐 - 这将是您更好的投资时间。否则,咬紧牙关并花费九次击键。
请注意,通过do
或require
在运行时执行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.