Calocybe: Sichtbarkeit von Funktionen

Beitrag lesen

Hallo Cracks!

Der Titel ist vielleicht nicht 100% passend, aber was besseres ist mir jetzt mal nicht eingefallen.

Bei meiner aktuellen Entwicklung habe ich im Prinzip ein grosses Programm, dass ich zwecks Wiederverwendbarkeit auf mehrere Dateien verteilt habe. Diese Dateien binde ich mittels require ein. Ich verwende nicht use, da ich vor dem Includen noch ein paar globale Variablen stehen habe, die in den Include-Dateien schon bekannt sein sollen. Ich rede von Include-Dateien und nicht von Modulen, da ich keine package-Statements verwende und somit alle Funktionen auf dem top level angesiedelt sind.

So habe ich nun also eine Hauptdatei namens mind.pl und binde dort unter anderem mit
    require "mindtemplate.inc.pl"
eine dieser Include-Dateien ein. Jetzt gibt es da zwei Merkwuerdigkeiten, die ich gerne erklaert bekommen wuerde.

1. Funktionen, die ich in den Include-Dateien definiert habe, scheint der Interpreter nur halb zu kennen. Er findet sie nur, wenn ich sie mit Klammern aufrufe. Lasse ich die Klammern weg, betrachtet er das Statement als "bare word", was je nach Kontext zu verschiedenen Warnungen/Fehlern fuehrt. Der Aufruf
    SetCommonTemplateData();
funktioniert also einwandfrei,
    SetCommonTemplateData;
erzeugt dagegen die Warnung "Useless use of a constant in void context at mind.pl line 202." (und die Funktion wird nicht aufgerufen). Wenn die Funktion Argumente bekommt, wie z.B.
    $err = LoadConfigFile $CONFIG_FILENAME, %CONFIG;
wird die Warnung "Useless use of reference constructor in void context at mind.pl line 266." fuer das %CONFIG erzeugt (vermutlich als sinnloses Statement rechts vom Komma-Operator angesehen) und dann der Fehler "Can't call method "LoadConfigFile" without a package or object reference at mind.pl line 266.". (Die Warnung wird uebrigens schon zur Compile time erzeugt, die Fehlermeldung erst zur Laufzeit.)

2. Ich habe eine Funktion
    sub EvaluateTemplateData(@) { ... }
in einer dieser Include-Dateien, die zwingend eine Referenz auf ein Array haben will. Rufe ich diese von innerhalb dieser Include-Datei mit
    EvaluateTemplateData(@template);
auf, erhalte ich die Fehlermeldung
    Type of arg 1 to main::EvaluateTemplateData must be array (not reference constructor) at mindtemplate.inc.pl line 98, near "@template)"
Also rufe ich nun ohne den Backslash auf, und es geht (scheinbar wird automatisch eine Referenz erzeugt). Nun rufe ich die Funktion aber auch von anderen Dateien aus auf. Wenn ich dort auch nur
    EvaluateTemplateData(@template);
schreibe, wird wirklich das Array uebergeben, nicht eine Referenz darauf. Ist nicht ganz verwunderlich, wenn wie bei 1. festgestellt die Funktionsdefinition offenbar nicht bekannt ist. Als Folge tut die Funktion scheinbar ueberhaupt nichts, es gibt aber auch keine Fehlermeldungen oder Warnungen. Aber warum ueberhaupt darf ich innerhalb der mindtemplate.inc.pl nicht mit @template als Argument aufrufen?

Nun ja, freue mich auf Erleuchtung...

Calocybe