gpt4 book ai didi

perl - 为什么 Perl 在使用 bigint 时会警告 "useless constant 1"?

转载 作者:行者123 更新时间:2023-12-04 05:49:07 25 4
gpt4 key购买 nike

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

常数是强制性的1在模块的末尾,通常会被警告忽略为 perldoc perldiag 说:

This warning will not be issued for numerical constants equal to 0 or 1 since they are often used in statements like

1 while sub_with_side_effects();


(可能有更好的来源。毕竟 1 在文件末尾是完全需要的,不要被警告。)

但是,如果它们 use bigint,即使对于几乎空的模块也会生成警告。 .
package Foo;

use bigint;

1;

对于这个简单的文件语法检查会产生以下警告:
$> perl -Wc Foo.pm
Useless use of a constant (1) in void context at Foo.pm line 5.
Foo.pm syntax OK

我找不到对 bigint 的任何引用和警告消息, Put long hex numbers in sqlite 除外但这并不能真正解决我的问题,我认为。

我的 Perl 是 Cygwin 上的 v5.14.4,带有 bigint 0.36。

最佳答案

这里有两个问题。

  • 为什么use bigint; 1;在无效上下文中警告?
  • 为什么常量首先在 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

    为什么use bigint; 1;在无效上下文中警告?
    use bigint;安装一个在解析器遇到常量文字时调用的回调,并且将回调返回的值用作常量。因此,在 use bigint; 下, 1不再只是一个简单的 01 .

    但是你没有做错任何事,所以这个警告是虚假的。您可以使用 () 来解决它。或 undef而不是 1 .
    undef while sub_with_side_effects();

    除非我需要在我的代码库中使用它,否则我会支持以下内容:
    while ( sub_with_side_effects() ) { }
    $ 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

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

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

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

    将模块用作脚本可能会导致虚假的警告和错误,传递 -W 也是如此。 .使用如下方式测试模块:
    perl -we'use Module'

    实际上,您甚至不需要 -w因为你应该已经有 use warnings;在模块中。你真正需要的是
    perl -e'use Module'

    关于perl - 为什么 Perl 在使用 bigint 时会警告 "useless constant 1"?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28199763/

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