使用和要求之间的差异(我列出了差异,需要知道还有什么)

时间:2013-08-14 12:08:47

标签: perl perl-module

我甚至从perldocStackOverflow阅读了解释。但是有点混乱。

  1. use通常在编译时加载模块,而require在运行时加载
  2. use仅调用内置导入函数,而require需要单独调用导入模块,如

    BEGIN {
        require ModuleName;
        ModuleName->import;
    }
    
  3. 如果我们想偶尔加载更大的模块,则使用
  4. require

  5. use会在较早的状态下抛出异常,而require会在遇到问题时执行此异常
  6. 使用use,我们可以选择性地加载程序,但不是很少,只需要

    use Module qw(foo bar) # it will load foo and bar only
    
  7. 是否可以require

    Beisdes在userequire之间存在另一个差异吗?

    关于谷歌的很多讨论,但我只理解上述几点 请帮我点其他。

3 个答案:

答案 0 :(得分:7)

这有点像myourlocal之间的差异。差异很重要,但您应该在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)

使用和要求之间的区别:

  • 如果我们使用“use”则无需提供文件扩展名。例如:使用 server_update_file。
  • 如果我们使用“require”需要提供文件扩展名。例如:要求 “server_update_file.pm”;
  • “use”方法仅用于模块。
  • “require”方法用于库和模块。

请参阅链接以获取更多信息:http://www.perlmonks.org/?node_id=412860