显式 package main 与隐式 package main 在哪些方面表现不同?

In what ways does explicit package main perform differently than an implicit package main?

我的印象是一个文件开始

use constant FOO => rand();

有效

package main;
use constant FOO => rand();

但是,如果我有 两个 文件带有上面的常量声明,一个文件 requires 另一个文件一切正常,而第二个文件将生成一个警告。

Constant subroutine main::FOO redefined at /usr/lib/x86_64-linux-gnu/perl-base/constant.pm line 171.

作为参考,这是我在 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 的工作方式有何不同?

包语句与其说是声明,不如说是对该词法范围的操作。带有 package main; 的文件将切换到该包,而不管当前包是什么,当需要时;没有它,它将在需要时处于活动状态的包的上下文中执行。