这两个关于注释和原型的警告在Perl中意味着什么?
我有以下代码这两个关于注释和原型的警告在Perl中意味着什么?,perl,Perl,我有以下代码 #! /usr/bin/perl use strict; use warnings; ################### Start Main #################### my @startupPrograms = qw(google-chrome thunderbird skype pidgin ); my @pagesToBeOpenedInChrome = qw(http://www.google.com/ http://stackoverflow.co
#! /usr/bin/perl
use strict;
use warnings;
################### Start Main ####################
my @startupPrograms = qw(google-chrome thunderbird skype pidgin );
my @pagesToBeOpenedInChrome = qw(http://www.google.com/ http://stackoverflow.com/ https://mail.google.com/mail/u/0/#inbox);
main();
#################################################
sub main() {
}
我得到以下警告
[aniket@localhost TestCodes]$ ./test.pl
Possible attempt to put comments in qw() list at ./test.pl line 8.
main::main() called too early to check prototype at ./test.pl line 9.
程序运行良好,但我无法理解警告。它们是什么意思
可能尝试在qw()列表中的./test.pl第8行添加注释
由于您的引用单词列表中有一个#
,因此出现此警告。#
在Perl中启动注释。警告让您知道您可能错误地在其中添加了注释
v
qw(http://www.google.com/ http://stackoverflow.com/ https://mail.google.com/mail/u/0/#inbox);
在第一个警告中,Perl抱怨quote运算符中的哈希:
my @foo = qw(foo bar #baz);
这里的散列是最后一个URL的一部分,Perl认为您可能想在那里放置注释。您可以通过明确引用以下项目来消除警告:
my @foo = (
'first URL',
'second URL',
'and so on',
);
它的可读性也更高,qw(…)
结构更适合只用于更简单的列表
第二个警告有点奇怪,因为Perl显然知道sub,否则它不会抱怨。无论如何,您可以在子定义中删除()
部分,一切都会正常:
sub main {
}
这里的()
做了一些你想象不到的事情,不需要定义一个简单的sub(它是一个,而且很可能你不想使用它。)顺便说一下,在Perl中根本不需要声明main
sub,只需转储你需要的任何代码而不是sub定义。此警告:
Possible attempt to put comments in qw() list at ./test.pl line 8.
main::main() called too early to check prototype at ./test.pl line 9.
指指定行的这一部分:
.... https://mail.google.com/mail/u/0/#inbox);
# ---^
#
符号是Perl中的注释,qw()
附带了一些特殊警告。这没什么好担心的,但在这种情况下,它看起来确实像是一个多余的警告。如果您想修复它,您可以将分配包含在一个块中,并使用无警告“qw”
。但是,对于词汇范围的变量,这有点笨拙:
my @pages; # must be outside block
{
no warnings 'qw';
@pages = qw( .... );
}
我对warnings'qw'
的有用性有些怀疑,在一个小脚本中,您可以通过在脚本顶部添加no warnings'qw'
来全局删除pragma
此警告:
Possible attempt to put comments in qw() list at ./test.pl line 8.
main::main() called too early to check prototype at ./test.pl line 9.
这与子名称后面的空括号有关。它们表示您希望与子例程一起使用,并且应该在不使用参数的情况下调用sub。原型用于使子例程的行为类似于内置程序,也就是说,它不是您真正需要担心的事情,在几乎所有情况下都应该忽略。所以只要去掉空括号就行了
如果您真的希望使用原型,那么您需要将预声明或子声明本身放在您打算使用它的位置之前。例如
sub main (); # predeclaration
main();
sub main () {
}
删除第二个警告
main::main() called too early to check prototype at ./test.pl
可以使用&main()调用main()方法
在我这方面,我尝试将URL放在“”中,但仍然有警告可能是因为您保留了引用操作符,
qw(“#”)
仍然会触发警告。但是当你明确引用列表时,(“#”)
,警告就会消失。不,谢谢。删除不必要的原型(sub-main{…
)比使用&
符号忽略它要好得多。没有理由教坏习惯。my@pages=do{no warnings'qw';qw(…)}
那就行了。这是一个恼人的问题,尽管没有做错任何事,但无法删除警告。qw()
中关于
的警告对我来说似乎合理。我不确定我是否可以通过阅读文档来证明
没有在qw()
中引入注释(我也不确定我是否会不想要它)。