显式主包与隐式主包在哪些方面表现不同?
Posted
技术标签:
【中文标题】显式主包与隐式主包在哪些方面表现不同?【英文标题】:In what ways does explicit package main perform differently than an implicit package main? 【发布时间】:2021-05-08 10:44:48 【问题描述】:我的印象是一个文件开始
use constant FOO => rand();
有效
package main;
use constant FOO => rand();
但是,如果我有 两个 具有上述常量声明的文件,一个文件 require
s 另一个文件一切正常,而第二个文件将生成警告。
在 /usr/lib/x86_64-linux-gnu/perl-base/constant.pm 第 171 行重新定义常量子例程 main::FOO。
作为参考,这是我在f1.pl
中使用的代码,f2.pl
是相同的但删除了require
。
# in `f1.pl`
package main;
no warnings;
use constant FOO => rand();
package Other;
require "f2.pl"; # this line should be removed from f2.pl
1;
隐式 package main
与显式 package main
的工作方式有何不同?
【问题讨论】:
那是哪个 perl 版本?我无法在 5.32 上重现此内容。 在 Perl 5.30.0 中,只有当 f1.pl 和 f2.pl 中 FOO 的实际值不同时,我才会收到警告。恕我直言,这很有意义。该行为不取决于我是否明确声明'package main;'与否。 与 perl 5.28.1 上的@BarneySchmale 相同 - 如果值不同,我会收到警告,如果它们相同,则不会收到警告。对于一个文件、两个文件或一个文件中的隐式与显式“主包”的所有组合,这些结果都是相同的。 @zdim, '使用常量;'比简单地安装子程序更神奇。我假设 constant.pm 有一个明确的检查,只有在 $main::FOO 的重新定义具有不同的值时才会发出警告。 我不得不更新这个问题,昨晚我写这篇文章时没有提供足够的上下文来回答它。那是我的错。当我知道我正在处理的问题是什么时,我更新了问题。实际上,在我更新它之后 36 秒,我才能自己回答它Grinnz 输入了一个 54 字的答案。所以我们知道他输入了 120 WPM? amirite? 【参考方案1】:package 语句与其说是声明,不如说是对该词法范围的操作。带有package main;
的文件将切换到该包,无论需要时当前包是什么;没有它,它将在需要时处于活动状态的包的上下文中执行。
【讨论】:
这正是令人困惑的地方,回复:没有它,它将在需要时处于活动状态的包的上下文中执行。 IE。 除了脚本入口之外,没有隐式包 main。 或者更具体地说,在解释器启动时。以上是关于显式主包与隐式主包在哪些方面表现不同?的主要内容,如果未能解决你的问题,请参考以下文章
何时在 Selenium Webdriver 中使用显式等待与隐式等待?