Moin!
local *ERRDOC;
??? Was macht denn das? der * ist mir aus C-Derivaten bekannt, aber in Perl hab ich das noch nie gesehen. Sag mir bitte nicht dass das jetzt ein "file-pointer" ist!
* hat in Perl auf jeden Fall eine andere Bedeutung als in C (dereferenzieren geht in Perl ja mit dem Zeichen des jeweils zu erreichenden Variablentyps). Aber was es ganz genau bedeutet, weiss ich auch nicht.
In diesem Falle sorgt 'local' dafuer, dass ERRDOC innerhalb des Blockes (nur deswegen habe ich extra noch die geschweiften Klammern aussenrum gemacht) von einer evtl. schon existierenden globalen ERRDOC Variable abgekoppelt wird. Ist also erstmal so aehnlich wie 'my', jedoch ist dieses ERRDOC jetzt auch noch in jeder aufgerufenen Funktion sichtbar (was bei 'my') nicht der Fall ist. Man sollte das local in diesem Falle verwenden, um Konflikte zu vermeiden (und weil 'my' dafuer nicht funktioniert), genaugenommen waere es wohl nicht noetig, aber ich halte meinen Code eben gerne sauber.
Nun wuerde man normalerweise z.B. 'local $variable' schreiben, wenn man sowas machen will, nur haben die FILE-Handles leider kein $, @, % oder & vorne dran. Mit * erwischt man jetzt glaube ich *alle* Variablen mit diesem Namen, also $ERRDOC, @ERRDOC, %ERRDOC, die Funktion &ERRDOC und auch das IO-Handle ERRDOC. Ich finde das ganz schoen komisch und verwirrend, man sieht auf jeden Fall, das Perl urspruenglich ein ganz uebler Hack ohne Konzept war, und diese Altlasten schlagen eben bis heute durch. Allerdings ermoeglicht local auch einige echt coole und nuetzliche Dinge, siehe weiter unten.
Es gibt uebrigens das Modul FileHandle, das der bessere Weg ist, um Dateien zu oeffnen. Allerdings wusste ich nicht, ob das irgendwelche Probleme mit den anderen IO-Handles gibt, die in dem Script verwendet werden, deshalb habe ich lieber darauf verzichtet.
So, kann sein, dass das jetzt nicht alles ganz korrekt war. Lies einfach mal perlsub durch, da muesste das alles drinstehen.
local $/; undef $/;
Bei dir scheinen sich die Orakelsprüche mit einem "local" anzukündigen ;-) Was ist denn das für ein $-Dollar-Trick ?
$/ ist der Input record separator (siehe perlvar), der angibt, was der Zeilentrenner beim Dateienlesen ist (normalerweise "\n"). Wenn ich den mit undef loesche, wird die gesamte Datei als eine Zeile angesehen, die ich mit einem <ERRDOC> in ein Skalar einlesen kann. Allerdings verlaesst sich ja der Rest des Programms darauf, dass in $/ etwas vernuenftiges drinsteht. Also mache ich mit local so eine Art lokale Kopie, die am Ende des Blocks (in diesem Fall der if-Zweig) wieder vergessen wird. Nach dem if wird also der alte Wert automatisch wiederhergestellt. Besonders an dieser Stelle ist interessant, dass sich dieses local auch auf alle Subroutinen auswirkt, die von diesem Block aufgerufen werden. Aber wie gesagt, das steht auch in perlsub.
Noch ein kleiner Trick: Manche Module sind sehr unsauber geschrieben und spucken am laufenden Band Warnungen aus, wenn man mit -w gestartet hat. Dann kann man die Variable $^W (die dem -w Flag entspricht), temporaer auf 0 setzen, ungefaehr so:
{
local $^W = 0;
Module::DirtyFunction();
}
Manchmal ist Perl eben doch ne coole Sache. *g*
So long
P.S. Nicht uebelnehmen, ich hab jetzt keine Lust, mir das nochmal durchzulesen, bevor ich es abschicke. *g*