Что означают эти два предупреждения о комментариях и прототипах в 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 ответов


предупреждение:

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.

это связано с пустые скобки после имени подпрограммы. Они обозначают, что вы хотите использовать прототипы С вашей подпрограммой, и что ваш sub должен быть вызван без args. Прототипы используются для того, чтобы подпрограммы вели себя как встроенные, то есть не то, о чем вам действительно нужно беспокоиться, и почти во всех случаях следует игнорировать. Поэтому просто удалите пустые скобки.

если вы действительно, действительно хотите использовать прототипы, вам нужно поставить или predeclaration или саму декларацию перед местом, где вы собираетесь ее использовать. Е. Г.

sub main ();  # predeclaration

main();

sub main () {
}

в первом предупреждении Perl жалуется на хэш в операторе цитаты:

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

здесь хэш является частью последнего URL-адреса, и Perl думает, что вы, возможно, хотели бы разместить комментарий там. Вы можете избавиться от предупреждения, цитируя элементы эксплицитно:

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

это также более читаемый IMHO,qw(…) construct лучше подходит только для более простых списков.

второе предупреждение немного странно, потому что Perl, очевидно, знает о суб, в противном случае он не будет жаловаться. В любом случае, вы можете оставить () часть в определении sub, и все будет в порядке:

sub main {
}

на () здесь делает что-то еще, чем вы думаете, не нужно определять простой суб. (Это суб прототип и, скорее всего, вы не хотите использовать его.) Кстати, нет никакой необходимости объявлять main sub в Perl, просто сбросьте любой код, который вам нужен, вместо определения sub.


возможная попытка поместить комментарии в список qw (). /test.pl строка 8.

это предупреждение жалуется, потому что у вас есть # в списке цитируемых слов. The # запускает комментарий в Perl. Предупреждение позволяет узнать, что вы могли бы поместить комментарий там по ошибке.

                                                                                     v
qw(http://www.google.com/ http://stackoverflow.com/ https://mail.google.com/mail/u/0/#inbox);

удалить второе предупреждение

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

вы можете вызвать метод main () с помощью &main ()

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

}