2009-11-12 13 views
8

mam złożyć Perl tak:Dlaczego otrzymuję ostrzeżenia "zwane za wcześnie, aby sprawdzić prototyp" w moim kodzie Perla?

use strict; 
f1(); 

sub f3() 
{ f2(); } 

sub f1() 
{} 
sub f2() 
{} 

W skrócie, f1 nazywa zanim zostanie zdefiniowany. Tak więc Perl zgłasza ostrzeżenie: "f1 sprawdzono zbyt wcześnie, aby sprawdzić prototyp". Ale tak samo jest z f2, jedyną różnicą jest to, że jest wywoływana z innego podprogramu. Nie generuje ostrzeżenia dla f2. Czemu?

Jaki jest najlepszy sposób rozwiązania tego problemu?

  1. zadeklarować podprogram zanim to się nazywa
  2. wywołanie sub tak: &f1();
+3

Proszę używać formatowania podczas umieszczania próbek kodu: wcięcie linii przez 4 spacje spowoduje, że pojawią się one jako kod w pytaniu, z podświetlaniem i wszystkim. –

+0

Powinieneś dodać przełącznik -w, jeśli naprawdę chcesz, aby to się nie udało –

Odpowiedz

14

można całkowicie uniknąć tego problemu nie używając prototypy w pierwszej kolejności:

use strict; 

f1(); 

sub f3 { f2() } 

sub f1 {} 
sub f2 {} 

Don't use prototypes, chyba że wiesz, dlaczego ich używasz:

To wszystko jest bardzo potężne i powinno być używane tylko z umiarem, aby uczynić świat lepszym.

+1

Nie podoba mi się bit "nie używaj prototypów". Czasami są całkiem niezłe, na niektóre rzeczy. –

+0

Niewykorzystanie prototypów jest jednym z powodów, dla których ludzie narzekają na czytelność i łatwość konserwacji w Perlu. – jheddings

+5

@jheddings: Nie masz racji: prototypy Perla to, 99%, * nie są użyteczną funkcją *. Sprawiają, że kod * jest gorszy *. Nie wierz mi? Przeczytaj http://groups.google.com/group/comp.lang.perl.modules/msg/84484de5eb01085b?dmode=source&output=gplain&pli=1. Jedynym przydatnym prototypem w perlu jest '(&; @)'. – hobbs

2

Brak ostrzeżenia o połączeniu z f2() z f3() wydaje się być błędem.

use strict; 
use warnings; 

f1(); 

sub f1 { 
    my @a = qw(a b c); 
    f2(@a); 
} 

sub f2(\@) { print $_[0] } 

To drukuje "a". Jeśli albo wstępnie zdefiniujesz f2(), albo zamienisz kolejność definicji podprogramów, wyświetli się "ARRAY (0x182c054)".

Co do rozwiązania problemu, to zależy. Moje preferencje (w kolejności) będą następujące:

  1. Usuń prototypy z definicji podprogramów. Prototypy Perla nie robią tego, czego większość ludzi się spodziewa. Są naprawdę przydatne tylko do deklarowania subsów, które działają jak wbudowane. Chyba że próbujesz rozszerzyć składnię Perla, nie używaj ich.
  2. Przed rozpoczęciem pracy zaprogramuj podprogramy. Dzięki temu Perl może wiedzieć o prototypie przed napotkaniem jakichkolwiek połączeń.
  3. Zmień kolejność kodów tak, aby definicje podprogramów pojawiały się przed jakikolwiek połączeniami.
  4. Zadzwoń do podprogramów, używając notacji &foo(), aby pominąć sprawdzanie prototypów.
2

Jeśli zamierzasz nazwać to nawiasem, dlaczego używasz prototypów?

sub f1(){ ... } 

f1(); 

Jedyny przypadek, w którym użyłbym pustego prototypu, dotyczy podprogramu, który chcę pracować jak stała.

sub PI(){ 3.14159 } 

print 'I like ', PI, ", don't you?\n"; 

I faktycznie odradzam Perl 5 prototypów, chyba że chcesz, aby Twój podprogram zachowywać się inaczej niż miałoby to miejsce w przeciwnym razie.

sub rad2deg($){ ... } 

say '6.2831 radians is equal to ', rad2deg 6.2831, " degrees, of course.\n"; 

W tym przykładzie użyłbyś nawiasów, gdyby nie miał prototypu. W przeciwnym razie uzyskałby dodatkowy argument, a ostatni ciąg nigdy nie zostanie wydrukowany.

+0

Masz fałszywe "\ n" na końcu instrukcji say tam –

+0

Chciałem zmienić ją na 'print', więc nie musiałem" używać funkcji qw'say ";' lub 'użyj 5.10 .1; ' –

4

Po prostu usuń() z definicji podprogramu. Kiedy definiujesz za pomocą(), Perl myśli, że są to prototypy i musisz zdefiniować swój prototyp, zanim go użyjesz.

Spróbuj to ......

use strict; 
f1(); 

sub f3 
{ f2(); } 

sub f1 
{} 
sub f2 
{} 
0

Podczas definiowania funkcji w Perl nie należy używać nawiasów. Kiedy to zrobisz, pojawi się ten błąd. Tak jest źle:

sub DoSomthing(){ 
    #do what ever... 
} 

To jest do zrobienia:

sub DoSomthing{ 
    #do what ever... 
} 

żadnych nawiasów.

Bardziej szczegółowe wyjaśnienie znajduje się na stronie Perl Mave Gabora Szabo na temat podprogramów i funkcji w języku Perl. https://perlmaven.com/subroutines-and-functions-in-perl

Powiązane problemy