在Perl中,关于注释和原型的这两个警告意味着什么?

时间:2013-08-23 11:47:12

标签: 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.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.

程序运行正常,但我无法理解警告。他们是什么意思?

4 个答案:

答案 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() {

}