我甚至从perldoc
和StackOverflow
阅读了解释。但是有点混乱。
use
通常在编译时加载模块,而require
在运行时加载 use
仅调用内置导入函数,而require
需要单独调用导入模块,如
BEGIN {
require ModuleName;
ModuleName->import;
}
require
。
use
会在较早的状态下抛出异常,而require
会在遇到问题时执行此异常使用use
,我们可以选择性地加载程序,但不是很少,只需要
use Module qw(foo bar) # it will load foo and bar only
是否可以require
?
Beisdes在use
和require
之间存在另一个差异吗?
关于谷歌的很多讨论,但我只理解上述几点 请帮我点其他。
答案 0 :(得分:7)
这有点像my
,our
和local
之间的差异。差异很重要,但您应该在99%的时间内使用my
。
Perl是一种相当古老而苛刻的语言。多年来,它已经从awk / shell / kitchen sink语言组合演变为更强大的类型和更强大的语言。
回到Perl 3.x天前, modules 和 packages 的概念已经固化,没有模块的概念具有自己的函数和变量命名空间。一切都随处可见。 import 没有任何内容。 use
关键字不存在。您始终使用require
。
到Perl 5出现时,模块有自己的变量和子程序名称存储。因此,我可以在我的计划中使用$total
,而我的Foo::Bar
模块也可以使用$total
,因为我的$total
真的是$main::total
和他们的$total
真的是$Foo::Bar::total
。
导出是一种从主程序可用的模块中创建变量和子程序的方法。这样,您可以说copy( $file, $tofile);
而不是File::Copy::copy( $file, $tofile );
。
use
关键字只是为您自动化的内容。另外,use
在程序执行之前在编译时运行。这允许模块使用prototyping,因此您可以说foo( @array )
而不是foo( \@array )
或munge $file;
而不是munge( $file );
正如use perldoc页面中所述:
[use] 完全 相当于:
BEGIN { require Module; Module->import( LIST ); }
基本上,您应该在99%的时间内use
使用require
。
我只能想到您需要require
使用use
的情况,但这只是模仿use
。有时模块是可选的。如果Foo::Bar
可用,我可以使用它,但如果不是,我不会。如果我能检查Foo::Bar
是否可用,那就太好了。
我们试试这个:
eval { use Foo::Bar; };
my $foo_bar_is_available = 1 unless ($@);
如果Foo::Bar
不可用,我明白了:
Can't locate Foo/Bar.pm in @INC (@INC contains:....)
那是因为use
在我可以运行eval之前发生了。但是,我知道如何使用use
模仿require
:
BEGIN {
eval { require Foo::Bar; Foo::Bar->import( qw(foo bar barfu) ); };
our foo_bar_module_available = 1 unless ($@);
}
这确实有效。我现在可以在我的代码中检查这个:
our $foo_bar_module_available;
if ( $foo_bar_module_available ) {
fubar( $var, $var2 ); #I can use it
}
else {
... #Do something else
}
答案 1 :(得分:4)
我认为你自己在第二点写的代码是自我解释的两者之间的差异......
在实践中,“使用”执行模块的“要求”,然后自动导入模块,而“需要”而不是模块只是必须存在,但您可以在需要时自由导入模块...
鉴于上述内容,结果很明显,第5点中的问题没有意义,因为“require”不会导入任何东西,没有必要指定要加载的模块部分,你可以有选择地加载你的部分你需要什么时候进行导入操作......
请记住,虽然“use”在编译时执行(Perl编译阶段),“require”在运行时执行,因此与“require”只有在真正需要时才能导入包。
答案 2 :(得分:1)
使用和要求之间的区别:
请参阅链接以获取更多信息:http://www.perlmonks.org/?node_id=412860