10

perldoc我什至从和阅读了解释StackOverflow。但是有一点混乱。

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

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

  4. use在早期状态抛出异常,而require当我遇到问题时
  5. 有了use我们可以选择性地加载程序,而不是全部,但很少喜欢

    use Module qw(foo bar) # it will load foo and bar only
    

也有可能require吗?

useBeisdes和之间还有其他区别require吗?

很多关于谷歌的讨论,但我只理解上面提到的这些点。
请帮助我其他观点。

4

3 回答 3

8

my这有点像,our和之间的区别local。差异很重要,但您应该在my99% 的时间内使用。

Perl 是一种相当古老而粗鲁的语言。多年来,它已经从组合的 awk/shell/kitchen sink 语言发展成为一种更强大的类型化和更强大的语言。

回到 Perl 3.x 中,在模块的概念固化之前的几天,没有模块有自己的函数和变量命名空间的概念。一切都随处可见。没有什么可导入的。use关键字不存在。你总是用require.

到 Perl 5 出来的时候,模块已经有了自己的变量和子例程名称的存储。因此,我可以$total在我的程序中使用,我的Foo::Bar模块也可以使用$total,因为 my $totalwas really$main::total和 their $totalare really $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% 的时间。

我只能想到一个需要使用requireover的场合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
}
于 2013-08-14T15:13:50.277 回答
6

我认为您在第二点中自己编写的代码是对两者之间区别的自我解释......

在实践中,“使用”执行模块的“要求”,然后自动导入模块,而“要求”只是强制模块存在,但您可以在需要时自由导入它......

鉴于上述内容,很明显第 5 点中的问题没有任何意义,因为“require”不导入任何内容,因此无需指定要加载的模块部分,您可以在需要时选择性地加载所需的部分将进行导入操作...

此外请记住,虽然“使用”在编译时(Perl 编译阶段)起作用,而“需求”在运行时起作用,因此使用“要求”你将能够仅在和/或当它真的是需要。

于 2013-08-14T12:23:48.523 回答
1

使用和需要的区别:

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

有关更多信息,请参阅链接:http ://www.perlmonks.org/?node_id=412860

于 2016-11-30T11:59:20.083 回答