【问题标题】:Why LWP::UserAgent is imported by require LWP::UserAgent instead of use LWP::UserAgent?为什么 LWP::UserAgent 是通过 require LWP::UserAgent 而不是使用 LWP::UserAgent 导入的?
【发布时间】:2011-09-24 18:58:29
【问题描述】:

我对这种语言还很陌生,但我之前一直使用use 导入特定模块,

为什么LWP::UserAgent 使用require 来完成perldoc LWP::UserAgent 的工作:

require LWP::UserAgent;

【问题讨论】:

    标签: perl require perl-module


    【解决方案1】:
    use LWP::UserAgent;
    

    相同
    BEGIN {
        require LWP::UserAgent;
        import LWP::UserAgent;
    }
    

    如果require LWP::UserAgent; 是可接受的,则表明import 对 LWP::UserAgent 没有任何作用。也许文档使用require 的目的是为了巧妙地暗示这一点?

    require LWP::UserAgent;use LWP::UserAgent; 之间的唯一区别在于require 的执行时间。对于前者,它发生在整个文件编译之后。对于后者,它会在该语句被编译后立即发生。实际上,面向对象的模块没有太大区别。

    我个人使用

    use LWP::UserAgent qw( );
    

    和这个是一样的

    BEGIN {
        require LWP::UserAgent;
    }
    

    这样,我保证不会导入任何我不想要的东西,而且我使用熟悉的use 用于其他模块。

    【讨论】:

    • 所以区别是import LWP::UserAgent; ,那么这到底是做什么的呢?
    • import LWP::UserAgentLWP::UserAgent->import() 的变体语法;它调用了一个名为import 的类方法。通常,这将使用 Exporter 模块将函数导出到调用者的命名空间中,但它实际上可以做模块作者选择做的任何事情。
    【解决方案2】:

    require Module::Name 与 use 的效果相同,只是在运行时,而不是编译时。当您想要有条件地需要一个模块时,这有时是有利的。我认为文档没有任何特别的理由说需要而不是使用。

    【讨论】:

    • 编译时间和运行时间的差异只存在于 Perl 持久化的fastcgi,而不是CGI 模式,对吧?
    • @Learning,没有。 require 只会加载和执行一次模块,无论require 是在编译时完成还是在运行时完成。
    • 学习:一般来说没有。如果在 require 之前还有其他代码,它将在 require 失败之前执行。
    【解决方案3】:

    这不是理想的答案,但可能对像我一样从谷歌来到谷歌的人有所帮助。

    对于消息错误:在 ./apache_accesses 第 86 行未找到 LWP::UserAgent。

    解决方案: apt-get install libwww-perl

    【讨论】:

    • 这个问题是关于use vs. require,以LWP为例。这不是让 LWP 工作。此外,您的答案是特定于 Debian 的。
    • 我知道,但我在寻找这个灵魂,并首先从谷歌获得了这个网站。
    猜你喜欢
    • 2019-01-20
    • 1970-01-01
    • 1970-01-01
    • 2013-02-26
    • 1970-01-01
    • 2021-02-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多