perl 中的 "once" 警告是什么?

What is the "once" warnings in perl?

我有代码,

no warnings 'once';

正在阅读 man warnings 我没有看到 /once/ 这是做什么的?

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

perl -wE'$foo = 4;'

哪个输出,

Name main::foo used only once: possible typo at -e line 1.

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

Global symbol $foo requires explicit package name (did you forget to declare my $foo?) at -e line 1.

可以 禁用警告,而不启用 strict 通过 no warnings "once"; 虽然我强烈建议 你只需删除未使用的代码而不是使警告静音。

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

既丑陋又无所作为。

如果你运行以下你会触发警告,加上一点额外的解释:

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

警告适用于符号 table 条目(不是 "my" 词法变量)。如果你在上面添加 -Mstrict,你将创建一个严格的违规,因为你的变量违反了 strict 'vars',它禁止你使用尚未声明的变量,除了引用的包全局变量通过他们的完全合格的名称。如果您使用 our 预先声明 $foo,则警告消失:

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

这很好用;它避免了严格违规,并避免了 "once" 警告。所以警告的目的是提醒您使用未声明的标识符,未使用完全限定名称,并且仅使用一次。 objective 是为了帮助防止符号名称中的拼写错误,假设是如果您只使用一次符号名称并且没有声明它,则可能是一个错误。

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

您可以在此处的警告层次结构中找到 'once' 警告:perldoc warnings

perldoc perldiag.

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