作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
在 Foo.pm 中使用以下代码:
use strict;
use warnings;
package Foo;
BEGIN {
$Foo::AUTHORITY = 'cpan:ETHER';
}
1;
将文件作为模块加载不会出现错误:
$ perl -I. -mFoo -e1
$
然而,直接加载文件会:
$ perl Foo.pm
Name "Foo::AUTHORITY" used only once: possible typo at Foo.pm line 6.
此外,perl -e'require "Foo.pm"'
也不会发出警告。
为什么会有这种差异?很明显,文件的解析方式不同,但是如何以及为什么?
最佳答案
“为什么”是从技术角度,还是从语言设计角度?
从语言的角度来看,这是有道理的,因为模块中引用的变量很可能是模块公共(public) API 的一部分。例如,Data::Dumper 公开了一堆改变其行为的包变量。 (可以说是糟糕的设计,但是呵呵。)这些变量可能只在模块中被引用一次,但可能会被程序的其他部分引用。
如果它只在主脚本中被引用一次,而没有模块引用它,那么它更有可能是一个错误,所以我们在脚本中得到这个警告,而不是在模块中。
从技术角度来看,这个警告是由gv.c
产生的。就我个人而言,我无法确定触发它的确切条件。
关于perl - 为什么 `perl Foo.pm` 和 `perl -I. -mFoo -e1` 的行为不同?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17705402/
在 Foo.pm 中使用以下代码: use strict; use warnings; package Foo; BEGIN { $Foo::AUTHORITY = 'cpan:ETHER'; }
我是一名优秀的程序员,十分优秀!