问题描述
我的印象是一个启动的文件
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;
的文件将切换到该包,无论当前包是什么,当需要时;如果没有它,它将在需要时处于活动状态的包的上下文中执行。