2009-07-01 8 views
0

Je rencontre des problèmes pour que les opérateurs de test de fichiers -e et -d fonctionnent de manière fiable.Quelles variables globales affectent les opérateurs de test de fichiers -e, -d dans Perl?

Les listes 1 et 2 se trouvent dans le même répertoire, sur un système NTFS Windows XP SP 3. Cependant, la liste 2 insiste sur le fait qu'un répertoire existe (ce n'est pas le cas), et le Listing 1 l'obtient correctement. La liste 2 fait partie du programme principal.

Aussi, intéressant, mon programme d'enregistrement refuse de créer/écrire dans un fichier, même lorsque je piège ouvert et j'imprime avec des instructions or croak. Je soupçonne que les deux sont connectés. Je l'ai inclus en tant que Listing 3.

Mon opinion est que les variables globales de Perl ne sont pas définies/définies quelque part et j'ai réussi à les faire frire (bien que j'ai essayé d'être très prudent).

Merci!

Liste 1:

use strict; 
use warnings; 

my $dir = "somedir2"; 

my $result= (-e $dir); 

if(! (-e $dir)) 
{ 
    print "$dir doesn't exist\n"; 
} 
else 
{ 
    print "$dir exists\n"; 
} 

#print "$result\n"; 


if(! (-d $dir)) 
{ 
    print "$dir isn't a dir!\n"; 
} 
else 
{ 
    print "$dir is a dir\n"; 
} 

Listing 2:

#Does the output directory not exist? 
    open_logger("logfile.txt"); 
    logger("initializing logfile."); 
    logger("Checking $outputdir for existence..."); 
    if(! (-e $outputdir)) 
    { 
     logger("$outputdir doesn't exist...creating"); 
     #if so, then create it 
     if(! mkdir($outputdir)) 
     { 
     $result = "Could not create $outputdir: $!"; 
      logger("Could not create $outputdir: $!"); 
     return ($success, $result); 
     } 
     logger("Created $outputdir"); 
    } 
    else 
    { 
     logger("$outputdir exists..."); 
    } 

    #is the directory not a directory? then die - something's off. 
    if(! (-d $outputdir)) 
    { 
     $result = "Failure: output directory $outputdir not a directory!\n"; 
     logger("$outputdir isn't a directory"); 
     return ($success, $result); 
    } 

Listing 3:

 my $fh_logger_package; 
sub open_logger 
{ 
    my $filename = shift; 
    open(FILE, ">$filename") or croak("Could not init logfile: $!"); 
    $fh_logger_package = \*FILE; 
    print STDERR "Opened $filename\n"; 
    if(! (-e $filename)) 
    { 
      croak("Crikey! Did not create file!"); 
    } 
} 
sub logger 
{ 
    my $message = shift; 

    print STDERR $message . "\n"; 
    print $fh_logger_package $message . "\n" or croak("Could not print to filehandle..."); 
} 

Répondre

5

-e et -d ne sont pas affectés par les variables, mais si vous n'êtes pas spécifiant le chemin complet, puis ils vérifient par rapport au répertoire de travail en cours. Il est possible que le code soit démarré à partir d'un emplacement différent ou modifie le répertoire en lui-même.

Questions connexes