Rolf Rost: subroutine mit prototyp

Beitrag lesen

hi,

also mal ne frage ich habe eine prozedur:

sub test(%$$) { mach was... }

ist mir nicht geläufig. Andererseits kannst Du mit

sub test($$$){ # ... }

Die Anzahl der zu übergebenden Argumente auf GENAU 3 festlegen, also je nach Anzahl der $ Zeichen...

und weiter unten rufe ich die auf:

my $value = test(%{$h_ref}, ${$s_ref}, ${$s_ref});

Prüfe da mal den Context, links hast Du ein Scalar, rechts einen hash und eine Liste...

dabei kommt mir immer folgender fehler:
called too early to check prototype

wie kann ich das denn umgehen und warum ruf ich was zu früh auf?

Wahrscheinlich hängt das mit Deiner Sub-Deklaration zusammen, die so nicht stimmen kann, siehe oben. Stets kannst Du nur Scalare in Subfunktionen geben, bzw. Referenzen (sind ja auch scalare) oder Listen (ein Array, mehrere Scalare).

Gruss, Rolf

--
Q: Wie kann ich die Anzahl der Argumente in einer Subroutine festlegen und kontrollieren?
A:
use strict; # empfohlen
sub foo($$$); # legt die Anzahl der Argumente für subfunction *foo* auf genau 3 fest
foo(1,2,3); # Aufruf der subfunction mit 3 Argumenten
# SubRoutine
sub foo($$$){
 for(@_){ print "$_\n" }
 return;
}
Anmerkung:
Stimmt die Anzahl der Argumente bei einem Aufruf nicht erscheint eine Fehlermeldung
und das Script bricht ab:
Too many arguments for main::foo ...
Not enough arguments for main::foo ...
Die Meldung *Prototype mismatch: sub main::foo ($$) vs ($$$) ...* sagt aus dass die Deklaration
nicht stimmt.