为什么sub中的use语句适用于全局?

CJ7*_*CJ7 7 perl scope module perl-module

use WWW::Mechanize;
$mech = new WWW::Mechanize;
$mech->get("http://www.google.com");
$html = HTML::TreeBuilder::XPath->new_from_content($mech->content);
sub test
{
    use HTML::TreeBuilder::XPath;
}
Run Code Online (Sandbox Code Playgroud)

上面的代码编译,因此该use语句在sub全球范围内应用.

为什么这样perl做?它没有任何意义.

ike*_*ami 6

use Module; 有两个影响.

第一种是加载模块.显然,这具有全球影响.如果多个其他模块使用模块,则不希望多次加载模块.

第二种是调用模块的import方法.对于大多数模块,这用于将符号导出到调用者的名称空间,以便可以调用这些函数,而无需使用完整的包名称对其进行限定.这显然不仅仅影响了一些sub,因为没有人给每个sub赋予它自己的命名空间.但那真的取决于你.

import然而,某些模块的方法做了一些完全不同的事情.它们改变了在指令存在的词法范围内编译代码的方式.这些被称为pragma.use strict;是一个例子.在sub中使用这些模块是有意义的.use HTML::TreeBuilder::XPath;然而,在子中使用是没有意义的.


ref*_*ind 4

perldoc是这么说的:

因为use在编译时生效,所以它不尊重正在编译的代码的普通流程控制。特别是,将 use 放在条件的 false 分支内并不会阻止它被处理。

不幸的是,它没有解释为什么这样设计。可能的原因可能是:

  • Perl 在很多情况下给你很大的自由 (TIMTOWTDI)
  • use在子例程内部可以显示您的意图,即您实际上只想在特定位置使用模块(即使它被全局加载)
  • 如果您稍后(重新)移动特定的子例程(其中包含use),则不必担心use从其他位置(例如脚本顶部)删除未使用的 。
  • ...

尽管这些想法听起来似乎有道理,但我会避免在子例程中加载模块,因为将它们全部放在一个位置而不是分散在各处会更清晰?