2009-07-01 1 views
0

-eと-dファイルのテスト演算子を確実に動作させることに問題があります。どのグローバル変数がPerlの-e、-dファイルテスト演算子に影響しますか?

リスト1と2は、NTFS Windows XP SP 3システム上の同じディレクトリにあります。しかし、リスト2はディレクトリが存在していることを示しています(そうではありません)。リスト1は正しいことを示しています。リスト2は、メインプログラムの一部です。

興味深いことに、私のロガールーチンは、開いたままトラップしてor croak文で印刷しても、ファイルの作成/書き込みを拒否しています。私は2つが接続されていると思う。私はそれをリスト3に含めました。

私の意見では、どこかでPerlのグローバル変数が設定/解除されていて、私はそれらをフライできました(私は非常に慎重にしようとしましたが)。

ありがとうございます!

リスト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"; 
} 

リスト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); 
    } 

リスト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..."); 
} 

答えて

5

-e-dは、任意の変数の影響を受けませんが、あなたはされていない場合されていますフルパスを指定すると、現在の作業ディレクトリに対して相対的にチェックされます。コードが別の場所から起動されているか、ディレクトリ自体が変更されている可能性があります。

関連する問題