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

时间:2019-11-05 20:30:43

标签: perl warnings

我有包含的代码

no warnings 'once';

阅读man warnings我看不到/once/的作用是什么?

2 个答案:

答案 0 :(得分:3)

只要您没有打开strict,perl便允许您使用变量而无需声明。

perl -wE'$foo = 4;'

哪个输出

  

名称main::foo仅使用一次:可能在-e第1行出现错字。

请注意strict下的内容,

  

全局符号$foo在-e第1行需要显式的程序包名称(您是否忘记声明my $foo?)。

可以禁用警告,而无需通过执行strict来启用no warnings "once";尽管我强烈建议您只是删除未使用的代码而不是静默警告

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

看上去既丑陋又什么也不做。

答案 1 :(得分: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

该警告适用于符号表条目(不适用于“我的”词汇变量)。如果在上面添加-Mstrict,则会创建一个严格的违规,因为您的变量违反了strict 'vars',该变量禁止您使用未声明的变量,但引用的包全局变量除外用他们的全名。如果您要用$foo预先声明our,警告就会消失:

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

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

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

您可以在以下位置的警告层次结构中找到“一次”警告:perldoc warnings

perldoc perldiag中提供了所有诊断性摘要的列表。