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

Ani*_*kur 9 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() {

}
Run Code Online (Sandbox Code Playgroud)

我得到以下警告

[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.
Run Code Online (Sandbox Code Playgroud)

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

TLP*_*TLP 14

这个警告:

Possible attempt to put comments in qw() list at ./test.pl line 8.
Run Code Online (Sandbox Code Playgroud)

指的是指定行的这一部分:

.... https://mail.google.com/mail/u/0/#inbox);
                                 # ---^
Run Code Online (Sandbox Code Playgroud)

#标志是Perl中的注释,qw()并附有一些特殊警告.没什么可担心的,但在这种情况下看起来确实像冗余警告.如果要修复它,可以将赋值括在一个块中并使用no warnings 'qw'.然而,对于词法范围的变量,这有点笨拙:

my @pages;    # must be outside block
{
    no warnings 'qw';
    @pages = qw( .... );
}
Run Code Online (Sandbox Code Playgroud)

我对它的用处有些怀疑warnings 'qw',在一个小脚本中你可以通过no warnings 'qw'在脚本顶部添加来全局删除pragma .

这个警告:

main::main() called too early to check prototype at ./test.pl line 9.
Run Code Online (Sandbox Code Playgroud)

这与您的子名称后面的空括号有关.它们表示你希望在子程序中使用原型,并且应该在没有args的情况下调用sub.原型用于使子例程的行为类似于内置函数,也就是说它不是您真正需要担心的事情,并且几乎在所有情况下都应该忽略.所以只需删除空括号即可.

如果您真的希望使用原型,则需要在您打算使用它的地方之前放置预先声明或子声明.例如

sub main ();  # predeclaration

main();

sub main () {
}
Run Code Online (Sandbox Code Playgroud)


zou*_*oul 12

在第一个警告Perl抱怨引用运算符中的哈希:

my @foo = qw(foo bar #baz);
Run Code Online (Sandbox Code Playgroud)

这里哈希是最后一个URL的一部分,Perl认为你可能想在那里发表评论.您可以通过明确引用项目来消除警告:

my @foo = (
    'first URL',
    'second URL',
    'and so on',
);
Run Code Online (Sandbox Code Playgroud)

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

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

sub main {
}
Run Code Online (Sandbox Code Playgroud)

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

  • 这可能是因为你保留了引用操作符,`qw('#')`仍然会触发警告.但是当你明确引用列表时,`('#')`,警告消失了. (3认同)