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包?