[Dresden-pm] Nachfrage wegen rätselhaften Verhalten von Perl

Hans-Dietrich Kirmse hd.kirmse at gmx.de
Son Jan 1 06:50:56 PST 2006


Hallo,

ich möchte alle Listenteilnehmern alle Gute für 2006
wünschen und hoffe, dass ich auch weiter über die Liste
Neuigkeiten zu Perl erfahre und gelegentlich eure
Unterstützung in Anspruch nehmen kann.

Ja, und genau letzteres trifft (unerwarteter Weise) leider
zu. Ich bin dabei, ein Script für unseren Schulserver zu
schreiben und hatte gedacht, ich hätte alles im Griff, aber
dem ist nicht so. Wenn ich die folgende Prozedur einmal aufrufe
geht alles, aber schon beim 2. Aufruf passiert einfach nichts.
hier: &copydir('F:/muster','F:/test/A02');  wird nicht abgearbeitet.
Es gibt keine Fehlermeldung und das Programm geht einfach weiter.
bedeutet: print "bin fertig\n";  wird ausgegeben. völlig rätselhaft.


Konkret (nur das eigentliche Problem):

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

#!c:/perl/bin/Perl.exe -w
use strict;

use File::Find;
use File::Copy;

# ------- Programm ----------------

&copydir('F:/muster','F:/test/A01');
&copydir('F:/muster','F:/test/A02');

print "bin fertig\n";

# ------- Prozeduren --------------

# kopiert den Inhalt eines Verzeichnisses in ein anderes
sub copydir
{
   my $quelle = shift;
   my $ziel   = shift;

   my $recht  = 0777;

   find (\&kopieren,$quelle);

   # ist sonst die Routine "wanted", was aber nichts zur Sache tut
   sub kopieren
   {
     my $reststring;  # der Pfad zur Datei gekürzt um den Pfad zur Quelle

     # wenn es nicht das Ausgangsverzeichnis (die Quelle) ist
     if ($quelle ne $File::Find::name) {
       # dann holen wir uns den "Rest" des Dateinamens nach der Quelle
       if ($File::Find::name =~ /^$quelle(.*)$/) { $reststring = $1 };
       # wenn das gefundene Element ein Verzeichnis ist
       if (-d $File::Find::name) {
         # dann legen wir im Ziel ein neues Verzeichnis an
         mkdir($ziel.$reststring,$recht);
       } else {
         # dann kopieren wir diese Datei in dieses Ziel
         copy($File::Find::name,$ziel.$reststring);
       }
     }
   } # Ende "sub kopieren"

} # Ende "sub copydir"

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

Ich kann mir keinen Reim darauf machen. Es wird zwar irgendwo im
CPAN auch sicher ein Modul geben, um das zu machen, aber ich wollte
eigentlich ohne irgendwelche Module auskommen, die nicht standardmäßig
installiert sind. Außerdem kann ich mir nicht erklären, wieso diese
Prozedur nicht öfter aufgerufen werden kann (das soll in einer Schleife
40 mal geschehen).


und dann habe ich noch ein kleineres Problem. die Variable "$recht"
soll in den Konfigurationsteil, damit die eigentlichen Serverbauer
ohne am eigentlichen Quelltext rumzusuchen diese Verzeichnisrechte
einfach ändern können. Ich habe das hier unter Windows erstellt, da
wird das eh ignoriert, aber unter Linux sind das doch Octalzahlen.
gibt man die dann als Sting an oder wie macht man das korrekt?


für Hinweise wäre ich sehr dankbar.


Mit freundlichen Grüßen
Hans-Dietrich