代码之家  ›  专栏  ›  技术社区  ›  Aniket Thakur

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

  •  9
  • Aniket Thakur  · 技术社区  · 13 年前

    我有以下代码

    #! /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 回复  |  直到 13 年前
        1
  •  15
  •   TLP    13 年前

    此警告:

    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' ,在一个小脚本中,您可以通过添加 没有警告'qw' 在脚本的顶部。

    此警告:

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

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

    如果你真的,真的想使用原型,你需要在你打算使用它的地方之前放一个预声明或子声明本身。

    sub main ();  # predeclaration
    
    main();
    
    sub main () {
    }
    
        2
  •  12
  •   zoul    13 年前

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

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

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

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

    它的可读性也更高 qw(…) 构造只更适合于更简单的列表。

    第二个警告有点奇怪,因为Perl显然知道sub,否则它不会抱怨。不管怎样,你可以放下 () 子定义中的一部分,一切都会好起来:

    sub main {
    }
    

    这个 () 这里做了一些你想象不到的事情,它不需要定义一个简单的sub sub prototype 而且很可能你不想用它。)顺便说一句,根本没有必要申报 main 在Perl中,只需将您需要的任何代码转储到那里,而不是子定义。

        3
  •  2
  •   simbabque    13 年前

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

    此警告会抱怨,因为您有 # 在你引用的单词列表中。这个 # 用Perl启动一个注释。警告会让你知道你可能错误地在其中添加了评论。

                                                                                         v
    qw(http://www.google.com/ http://stackoverflow.com/ https://mail.google.com/mail/u/0/#inbox);
    
        4
  •  -1
  •   ronyhuda    13 年前

    删除第二个警告

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

    您可以使用&主()

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