这两个关于注释和原型的警告在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()
中引入注释(我也不确定我是否会不想要它)。