gpt4 book ai didi

perl - 为什么 `perl Foo.pm` 和 `perl -I. -mFoo -e1` 的行为不同?

转载 作者:行者123 更新时间:2023-12-02 08:39:48 24 4
gpt4 key购买 nike

在 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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com