2013-08-23 9 views
9

Mam następujący kodCo oznaczają te dwa ostrzeżenia o komentarzach i prototypach w Perlu?

#! /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() { 

} 

i uzyskać następujące ostrzeżenie

[[email protected] 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. 

Program działa dobrze, ale nie jestem w stanie zrozumieć ostrzeżenia. Co mieli na myśli?

Odpowiedz

14

Ostrzeżenie:

Possible attempt to put comments in qw() list at ./test.pl line 8. 

odnosi się do tej części określonej linii:

.... https://mail.google.com/mail/u/0/#inbox); 
           # ---^ 

Znak # jest komentarz w Perlu i qw() ma kilka specjalnych ostrzeżeń z nim związane. Nie ma się czym martwić, ale w tym przypadku wygląda na zbędne ostrzeżenie. Jeśli chcesz to naprawić, możesz zamknąć zadanie w bloku i użyć no warnings 'qw'. Jest to jednak nieco niezgrabne ze zmienną zawężona leksykalnie:

my @pages; # must be outside block 
{ 
    no warnings 'qw'; 
    @pages = qw(....); 
} 

mam pewne wątpliwości co do przydatności warnings 'qw', aw niewielkim skrypcie można po prostu usunąć pragmy globalnie dodając no warnings 'qw' w górnej części skryptu.

Ostrzeżenie:

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

ten ma do czynienia z pustymi nawiasie po nazwie sub. Oznaczają one, że chcesz użyć prototypes z podprogramem, i że twój sub powinien być wywołany bez argumentów. Prototypy służą do tego, aby podprogramy zachowywały się jak wbudowane, co oznacza, że ​​nie jest to coś, o co naprawdę trzeba się martwić, i prawie we wszystkich przypadkach należy je ignorować. Po prostu usuń puste nawiasy.

Jeśli naprawdę, naprawdę chcesz korzystać z prototypów, musisz umieścić wcześniej deklarację wstępną lub deklarację podrzędną przed miejscem, w którym zamierzasz z niej korzystać. Na przykład.

sub main(); # predeclaration 

main(); 

sub main() { 
} 
+1

'my @pages = wykonaj {bez ostrzeżeń" qw "; qw (...)} ' – Borodin

+0

To zadziała. Jest to irytujący problem, ponieważ nie można usunąć ostrzeżenia, mimo że nie robi nic złego. – TLP

+1

[* (Prototypy są) wszystkie bardzo potężne, i ** powinny być używane tylko z umiarem **, aby uczynić świat lepszym miejscem. *] (Http://perldoc.perl.org/perlsub.html# Prototypy) –

2

Możliwa próba umieścić komentarze w qw() listy w ./test.pl linii 8.

To ostrzeżenie narzeka, bo masz # w liście cytowanym słowa. # uruchamia komentarz w Perlu. Ostrzeżenie informuje, że przez pomyłkę wstawiłeś tam swój komentarz.

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

W pierwszym ostrzeżeniem Perl narzeka mieszania w operatorze cytatem:

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

Tutaj hash jest częścią ostatniego URL i Perl myśli, że być może chciał umieścić tam komentarz. Można pozbyć się ostrzeżenia cytując elementy explictly:

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

Jest również bardziej czytelny IMHO The qw(…) konstrukt jest lepsze dopasowanie tylko prostsze list.

Drugie ostrzeżenie jest nieco dziwne, ponieważ Perl najwyraźniej zna się na subwozie, w przeciwnym razie nie narzekałoby. W każdym razie, można upuścić () udział w definicji sub, i wszystko będzie OK:

sub main { 
} 

() tutaj robi coś innego niż myślisz, to nie jest potrzebne, aby zdefiniować prosty sub. (Jest to sub prototype i najprawdopodobniej nie chcesz go używać.) Przy okazji, nie ma potrzeby deklarowania sub-subu main, po prostu zrzuć dowolny kod, który potrzebujesz, zamiast sub-definicji.

+0

Na mojej stronie starałem się umieścić URL wewnątrz '' ale nadal ma ostrzeżenie –

+3

Prawdopodobnie dlatego, że trzymałeś operatora cytowania, 'qw ('#')' nadal wyzwala ostrzeżenie. Ale kiedy cytujesz listę jawnie, '('#')', ostrzeżenie zniknie. – zoul

-1

Aby usunąć drugie ostrzeżenie

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

można nazwać główną metodę() z & main()

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

} 
+5

Nie, dziękuję. Usunięcie niepotrzebnego prototypu ('sub główne {...') byłoby znacznie lepsze niż użycie '' '' '' '' '' '' '' '' sigil ", aby go zignorować. Nie ma powodu, aby uczyć złych nawyków. – tjd

Powiązane problemy