为啥 LWP::UserAgent 是通过 require LWP::UserAgent 而不是使用 LWP::UserAgent 导入的?

Posted

技术标签:

【中文标题】为啥 LWP::UserAgent 是通过 require LWP::UserAgent 而不是使用 LWP::UserAgent 导入的?【英文标题】: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;

【问题讨论】:

【参考方案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 用于其他模块。

require 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 的。 我知道,但我在寻找这个灵魂,并首先从谷歌获得了这个网站。

以上是关于为啥 LWP::UserAgent 是通过 require LWP::UserAgent 而不是使用 LWP::UserAgent 导入的?的主要内容,如果未能解决你的问题,请参考以下文章

未通过 https 使用 LWP::UserAgent get() 获取预期内容

Perl LWP::UserAgent 错误处理 UTF-8 响应

LWP::UserAgent介绍2

LWP::UserAgent介绍1

perl LWP::UserAgent获取源码与响应

我可以强制 LWP::UserAgent 接受过期的 SSL 证书吗?