显式包 main 在哪些方面与隐式包 main 不同?

问题描述

我的印象是一个启动的文件

use constant FOO => rand();

有效

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

但是,如果我有两个带有上述常量声明的文件一个文件require一个文件一切正常,而第二个文件会产生警告。 >

常量子程序 main::FOO 在 /usr/lib/x86_64-linux-gnu/perl-base/constant.pm 第 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 语句与其说是声明,不如说是对该词法范围的操作。带有 package main; 的文件将切换到该包,无论当前包是什么,当需要时;如果没有它,它将在需要时处于活动状态的包的上下文中执行。