为什么Perl在使用bigint时警告"无用常数1"?

Dan*_*mer 8 perl perl-module bigint perlsyn

当我注意到语法检查结果警告无用的常量(1)时,我正在编写一个模块作为我的应用程序的一部分.这是为什么?

常量是1模块末尾的强制性,通常会被警告忽略,如下所示perldoc perldiag:

对于等于0或1的数值常量,不会发出此警告,因为它们通常用在类似的语句中

1 while sub_with_side_effects();
Run Code Online (Sandbox Code Playgroud)

(可能有一个更好的来源.毕竟1在文件的最后是完全需要的,不要被警告.)

但是,即使对于几乎空的模块,也会产生警告use bigint.

package Foo;

use bigint;

1;
Run Code Online (Sandbox Code Playgroud)

对于这个简单的文件语法检查,会产生以下警告:

$> perl -Wc Foo.pm
Useless use of a constant (1) in void context at Foo.pm line 5.
Foo.pm syntax OK
Run Code Online (Sandbox Code Playgroud)

bigint除了在sqlite中输入长十六进制数字之外,我找不到任何引用和警告消息,但我认为这并没有真正解决我的问题.

我的Perl是Cygwin的v5.14.4,bigint是0.36.

ike*_*ami 8

这里有两个问题.

  1. 为什么use bigint; 1;在无效背景下发出警告?
  2. 为什么常量首先在void上下文中执行?

$ perl -c -we'1 while sub_with_side_effects();'
-e syntax OK

$ perl -c -we'use bigint; 1 while sub_with_side_effects();'
Useless use of a constant (1) in void context at -e line 1.
-e syntax OK
Run Code Online (Sandbox Code Playgroud)

为什么use bigint; 1;在无效背景下发出警告?

use bigint;安装在解析器遇到常量文字时调用的回调,并将回调返回的值用作常量.因此,在下use bigint;,1不再是真正的简单01.

但是你没有做错什么,所以这个警告是虚假的.您可以使用()undef代替使用它来解决它1.

undef while sub_with_side_effects();
Run Code Online (Sandbox Code Playgroud)

除非我需要在整个代码库中使用它,否则我赞成以下内容:

while ( sub_with_side_effects() ) { }
Run Code Online (Sandbox Code Playgroud)
$ cat Module.pm
package Module;
use bigint;
1;

$ perl -c -w Module.pm
Useless use of a constant (1) in void context at Module.pm line 3.
Module.pm syntax OK
Run Code Online (Sandbox Code Playgroud)

为什么常量在void上下文中执行?

当Perl执行模块时,Perl期望模块返回标量值,因此Perl应该在标量上下文中执行模块.

但是,你告诉Perl编译脚本 Module.pm.当Perl执行脚本时,Perl不需要返回任何值,因此Perl在void上下文中执行脚本.

使用模块作为脚本可能会导致虚假警告和错误,因此可以传递-W.使用如下测试模块:

perl -we'use Module'
Run Code Online (Sandbox Code Playgroud)

实际上,你甚至不需要,-w因为你应该已经use warnings;在模块中.你真正需要的只是

perl -e'use Module'
Run Code Online (Sandbox Code Playgroud)


yst*_*sth 6

-W而不是use warnings;在您的模块中或使用-c检查模块而不是perl -MFoo -e0显示虚假错误.这是后者的一个例子.

正常加载模块时,它不在 void上下文中,因为它检查结果是否为true.

(请注意,当我使用5.20.1进行尝试时,-W也会导致虚假overload arg '..' is invalid at /usr/share/perl/5.20/Math/BigInt.pm line 155.)