perl 中的“一次”警告是什么?

What is the "once" warnings in perl?

提问人:Evan Carroll 提问时间:11/6/2019 更新时间:11/6/2019 访问量:611

问:

我有代码,

no warnings 'once';

阅读我没有看到这种情况的发生,这是做什么的?man warnings/once/

Perl 警告

评论

1赞 Grinnz 11/6/2019
perldiag中列出了具体警告:perldoc.pl/...
0赞 ikegami 11/6/2019
Perl 警告记录在 perldiag 中,可通过 和perldoc perldiagman perldiag

答:

4赞 Evan Carroll 11/6/2019 #1

只要你没有 on,perl 就允许你使用一个变量而不声明它。strict

perl -wE'$foo = 4;'

哪些输出,

名称仅使用一次:第 1 行可能有拼写错误。main::foo-e

请注意,这甚至不允许,strict

全局符号要求在 -e 第 1 行处显式包名(你忘了声明吗?$foomy $foo

不过,您可以禁用警告,而无需通过执行来启用,尽管我强烈建议您简单地删除未使用的代码,而不是使警告静音。strictno warnings "once";

perl -wE'no warnings "once"; $foo = 4;'

这既看起来很丑,又无所作为。

3赞 DavidO 11/6/2019 #2

如果运行以下命令,将触发警告,并添加一些额外的说明:

perl -Mdiagnostics -Mwarnings -e '$foo=1'

输出将是:

Name "main::foo" used only once: possible typo at -e line 1 (#1)
    (W once) Typographical errors often show up as unique variable names.
    If you had a good reason for having a unique name, then just mention it
    again somehow to suppress the message.  The our declaration is
    provided for this purpose.

    NOTE: This warning detects symbols that have been used only once so $c, @c,
    %c, *c, &c, sub c{}, c(), and c (the filehandle or format) are considered
    the same; if a program uses $c only once but also uses any of the others it

该警告适用于符号表条目(不是“my”词法变量)。如果添加到上述内容中,则会创建严格冲突,因为变量违反了 ,这禁止使用尚未声明的变量,但由其完全限定名称引用的包全局变量除外。如果您要预先声明 ,则警告将消失:-Mstrictstrict 'vars'$fooour

perl -Mdiagnostics -Mwarnings -Mstrict=vars -E 'our $foo=1'

这很好用;它避免了严格的违规,并避免了“一次”警告。因此,警告的目的是提醒您注意使用未声明的标识符、未使用完全限定名称以及仅使用一次的标识符。目的是帮助防止符号名称中的拼写错误,假设如果仅使用一次符号名称且未声明,则可能是错误。

特殊(标点符号)变量免于此检查。因此,您可以引用或仅引用一次,而不会触发警告。此外,并且是豁免的,因为它们被认为是特殊的,用于;在这样的结构中,它们可能只出现一次,但对相当典型的代码发出警告是没有用的。$_$/$a$bsort {$a <=> $b} @list

您可以在此处找到警告层次结构中列出的“一次”警告:perldoc 警告

perldoc perldiag 中提供了所有诊断简介的列表。

评论

0赞 Polar Bear 11/7/2019
David,谢谢你的解释——现在我有理由使用诊断模块了。
0赞 Eugen Konkov 1/8/2022
有趣的是,为什么没有出现警告my $x