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

Nit*_*esh 8 perl perl-module

我甚至从perldoc和读到了解释StackOverflow.但有一点混乱.

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

    BEGIN {
        require ModuleName;
        ModuleName->import;
    }
    
    Run Code Online (Sandbox Code Playgroud)
  3. require 如果我们想偶尔加载更大的模块,则使用

  4. use在早期状态抛出异常,而require在遇到问题时抛出异常
  5. 随着use我们可以有选择地加载的程序不是所有的,但很少像

    use Module qw(foo bar) # it will load foo and bar only
    
    Run Code Online (Sandbox Code Playgroud)

它也可能require吗?

Beisdes是有之间的另一个差异userequire

很多关于谷歌的讨论,但我只理解上述这些要点.
请帮我其他点.

Dav*_* W. 7

这有点像之间的差异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%的时间.

我只能想到一个场合,你需要使用requireuse,但这只是模仿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之前发生了.但是,我知道如何模拟userequire:

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)

  • 好点子.但是,我开始在一台运行8085A芯片的计算机上进行编程,该芯片的容量为1.5Mz,内存为48K.(这是一个多用户系统!).对我来说,慢的定义与你年轻的whippersnappers有点不同.对我而言,缓慢意味着我可以在等待程序完成时出去喝杯咖啡.而且,外出喝杯咖啡意味着乘飞机飞往意大利并在当地的咖啡馆品尝美味的咖啡,然后在回来之前做一些观光. (4认同)
  • 实际上`使用Scalar :: Util 1.0 qw(弱化)`更像是'BEGIN {需要Scalar :: Util; 标量:: Util-> VERSION(1.0); Scalar :: Util-> import(qw(weaken))}`我们应该真正更新文档. (2认同)

ale*_*oot 6

我认为您在第二点中自己编写的代码可以说明两者之间的区别......

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

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

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