我有以下代码
#! /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.
程序运行正常,但我无法理解警告。他们是什么意思?
答案 0 :(得分:14)
此警告:
Possible attempt to put comments in qw() list at ./test.pl line 8.
指指定行的这一部分:
.... https://mail.google.com/mail/u/0/#inbox);
# ---^
#
符号是Perl中的注释,qw()
附加了一些特殊警告。没什么好担心的,但在这种情况下看起来确实像冗余警告。如果要修复它,可以将赋值括在一个块中并使用no warnings 'qw'
。然而,这对于词法范围变量有点笨拙:
my @pages; # must be outside block
{
no warnings 'qw';
@pages = qw( .... );
}
我对warnings 'qw'
的用处有疑问,在一个小脚本中,您可以通过在脚本顶部添加no warnings 'qw'
来全局删除编译指示。
此警告:
main::main() called too early to check prototype at ./test.pl line 9.
这与您的子名后面的空括号有关。它们表示你希望在子程序中使用prototypes,并且应该在没有args的情况下调用你的sub。原型用于使子例程的行为类似于内置函数,也就是说它不是您真正需要担心的事情,并且几乎在所有情况下都应该忽略。所以只需删除空括号。
如果您真的希望使用原型,则需要在您打算使用它的地方之前放置预先声明或子声明。 E.g。
sub main (); # predeclaration
main();
sub main () {
}
答案 1 :(得分:12)
在第一个警告中,Perl抱怨引用运算符中的哈希:
my @foo = qw(foo bar #baz);
这里哈希是最后一个URL的一部分,Perl认为你可能想在那里发表评论。您可以通过明确引用这些项来消除警告:
my @foo = (
'first URL',
'second URL',
'and so on',
);
恕我直言也更具可读性,qw(…)
构造更适合更简单的列表。
第二个警告有点奇怪,因为Perl显然知道sub,否则它不会抱怨。无论如何,你可以将()
部分放在子定义中,一切都会好的:
sub main {
}
()
这里做的事情比你想象的要多,不需要定义一个简单的子。 (这是一个sub prototype,很可能你不想使用它。)顺便说一下,根本不需要在Perl中声明一个main
子,只需转储你需要的代码子定义。
答案 2 :(得分:2)
可能尝试将注释放在./test.pl第8行的qw()列表中。
此警告会抱怨,因为您的引用字词列表中有#
。 #
在Perl中发表评论。警告让您知道您可能错误地在那里发表评论。
v
qw(http://www.google.com/ http://stackoverflow.com/ https://mail.google.com/mail/u/0/#inbox);
答案 3 :(得分:-1)
删除第二个警告
main::main() called too early to check prototype at ./test.pl
你可以用& main()
调用main()方法&main();
^
#################################################
sub main() {
}