我甚至从perldoc和读到了解释StackOverflow.但有一点混乱.
use通常在编译时加载模块,而require在运行时加载模块use只调用内置的导入功能,而require需要单独调用导入模块
BEGIN {
require ModuleName;
ModuleName->import;
}
Run Code Online (Sandbox Code Playgroud)require 如果我们想偶尔加载更大的模块,则使用
use在早期状态抛出异常,而require在遇到问题时抛出异常随着use我们可以有选择地加载的程序不是所有的,但很少像
use Module qw(foo bar) # it will load foo and bar only
Run Code Online (Sandbox Code Playgroud)它也可能require吗?
Beisdes是有之间的另一个差异use和require?
很多关于谷歌的讨论,但我只理解上述这些要点.
请帮我其他点.
这有点像之间的差异my,our以及local.差异很重要,但你应该使用my99%的时间.
Perl是一种相当古老而苛刻的语言.多年来,它已经从awk/shell/kitchen sink语言组合演变为更强大的类型和更强大的语言.
回到Perl 3.x天,在模块和包的概念固化之前,没有模块的概念具有自己的函数和变量命名空间.一切都随处可见.没有什么可以导入的.该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在程序执行之前的编译时运行.这允许模块使用原型,因此您可以说foo( @array )代替foo( \@array )或munge $file;代替munge( $file );
正如在使用 perldoc的页面中所说:
它[use] 完全等同于:
BEGIN { require Module; Module->import( LIST ); }
基本上,你应该使用use超过require99%的时间.
我只能想到一个场合,你需要使用require过use,但这只是模仿use.有时模块是可选的.如果Foo::Bar可以,我可以使用它,但如果不是,我不会.如果我可以检查是否Foo::Bar可用,那将是很好的.
我们试试这个:
eval { use Foo::Bar; };
my $foo_bar_is_available = 1 unless ($@);
Run Code Online (Sandbox Code Playgroud)
如果Foo::Bar没有,我得到这个:
Can't locate Foo/Bar.pm in @INC (@INC contains:....)
Run Code Online (Sandbox Code Playgroud)
那是因为use在我可以运行eval之前发生了.但是,我知道如何模拟use与require:
BEGIN {
eval { require Foo::Bar; Foo::Bar->import( qw(foo bar barfu) ); };
our foo_bar_module_available = 1 unless ($@);
}
Run Code Online (Sandbox Code Playgroud)
这确实有效.我现在可以在我的代码中检查这个:
our $foo_bar_module_available;
if ( $foo_bar_module_available ) {
fubar( $var, $var2 ); #I can use it
}
else {
... #Do something else
}
Run Code Online (Sandbox Code Playgroud)
我认为您在第二点中自己编写的代码可以说明两者之间的区别......
在实践中,“use”执行模块的“require”,然后它会自动导入模块,而“require”模块只是强制存在,但您可以在需要时自由导入它......
鉴于上述内容,很明显第 5 点中的问题没有意义,因为“require”不导入任何内容,因此无需指定要加载的模块部分,您可以选择性地加载您需要的部分将进行导入操作...
此外请记住,虽然“use”在编译时(Perl 编译阶段)起作用,“require”在运行时起作用,因此使用“require”您将能够仅在和/或当它真的是时才能导入包需要。