提问人:Evan Carroll 提问时间:11/6/2019 更新时间:11/6/2019 访问量:611
perl 中的“一次”警告是什么?
What is the "once" warnings in perl?
答:
4赞
Evan Carroll
11/6/2019
#1
只要你没有 on,perl 就允许你使用一个变量而不声明它。strict
perl -wE'$foo = 4;'
哪些输出,
名称仅使用一次:第 1 行可能有拼写错误。
main::foo
-e
请注意,这甚至不允许,strict
全局符号要求在 -e 第 1 行处显式包名(你忘了声明吗?
$foo
my $foo
不过,您可以禁用警告,而无需通过执行来启用,尽管我强烈建议您简单地删除未使用的代码,而不是使警告静音。strict
no 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”词法变量)。如果添加到上述内容中,则会创建严格冲突,因为变量违反了 ,这禁止使用尚未声明的变量,但由其完全限定名称引用的包全局变量除外。如果您要预先声明 ,则警告将消失:-Mstrict
strict 'vars'
$foo
our
perl -Mdiagnostics -Mwarnings -Mstrict=vars -E 'our $foo=1'
这很好用;它避免了严格的违规,并避免了“一次”警告。因此,警告的目的是提醒您注意使用未声明的标识符、未使用完全限定名称以及仅使用一次的标识符。目的是帮助防止符号名称中的拼写错误,假设如果仅使用一次符号名称且未声明,则可能是错误。
特殊(标点符号)变量免于此检查。因此,您可以引用或仅引用一次,而不会触发警告。此外,并且是豁免的,因为它们被认为是特殊的,用于;在这样的结构中,它们可能只出现一次,但对相当典型的代码发出警告是没有用的。$_
$/
$a
$b
sort {$a <=> $b} @list
您可以在此处找到警告层次结构中列出的“一次”警告:perldoc 警告。
perldoc perldiag 中提供了所有诊断简介的列表。
评论
0赞
Polar Bear
11/7/2019
David,谢谢你的解释——现在我有理由使用诊断模块了。
0赞
Eugen Konkov
1/8/2022
有趣的是,为什么没有出现警告my $x
评论
perldoc perldiag
man perldiag