9

我有以下代码

#! /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

4 回答 4

15

这个警告:

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'在脚本顶部添加来全局删除 pragma。

这个警告:

main::main() called too early to check prototype at ./test.pl line 9.

这与您的子名称后的空括号有关。它们表示您希望在子例程中使用原型,并且应该在没有参数的情况下调用您的子程序。原型用于使子例程表现得像内置函数,也就是说它不是您真正需要担心的,并且在几乎所有情况下都应该忽略。所以只需删除空括号。

如果您真的非常希望使用原型,则需要在您打算使用它的地方之前放置一个预声明或子声明本身。例如

sub main ();  # predeclaration

main();

sub main () {
}
于 2013-08-23T12:00:50.593 回答
12

在第一个警告中,Perl 抱怨引用运算符中的散列:

my @foo = qw(foo bar #baz);

这里的散列是最后一个 URL 的一部分,Perl 认为您可能想在此处添加注释。您可以通过明确引用项目来消除警告:

my @foo = (
    'first URL',
    'second URL',
    'and so on',
);

恕我直言,它也更具可读性,该qw(…)结构更适合仅用于更简单的列表。

第二个警告有点奇怪,因为 Perl 显然知道 sub,否则它不会抱怨。无论如何,您可以将()部分放在子定义中,一切都会好起来的:

sub main {
}

这里()做的事情比你想象的要多,不需要定义一个简单的子。(它是一个子原型,很可能你不想使用它。)顺便说一句,根本不需要 main在 Perl 中声明一个子,只需在那里转储你需要的任何代码而不是子定义。

于 2013-08-23T11:55:14.670 回答
2

可能尝试将注释放在 ./test.pl 第 8 行的 qw() 列表中。

此警告抱怨是因为您#在引用的单词列表中有一个。在 Perl中#开始注释。该警告让您知道您可能错误地在其中添加了评论。

                                                                                     v
qw(http://www.google.com/ http://stackoverflow.com/ https://mail.google.com/mail/u/0/#inbox);
于 2013-08-23T11:53:03.090 回答
-1

删除第二个警告

main::main() called too early to check prototype at ./test.pl

您可以使用 &main() 调用 main() 方法

&main();
^
#################################################
sub main() {

}
于 2013-08-23T12:09:53.027 回答