2009-05-28 16 views
2

現在の作業ディレクトリの最後に別の変数を付けるPerlスクリプトを実行していますが、モジュールの使用に問題があります。Perl getcwd接尾辞スラッシュ

  1. 私はD:\からGETCWD実行した場合、返される値は

    D:/ (with forward slash) 
    

    である私はD:\Temp\からGETCWD実行した場合、返される値はこれが原因で状況はかなりトリッキーになり

    D:/temp (without forward slash) 
    

    です私が単純にすれば:

    use Cwd; 
    $ProjectName = "Project"; # This is a variable supplied by the user 
    $directory = getcwd().$ProjectName."\/"; 
    print $directory."\n"; 
    

    私は

    D:/Project (correct) 
    

    または

    D:/TempProject (instead of D:/Temp/Project) 
    

    のいずれかで終わるだろう、これはCwdの機能ですか!それはドキュメンテーションにはないようです。

  2. 私はこの問題を解決するために次のコードを考えました。それには3行かかります。あなたの誰かがより簡潔な方法を見ることができますか?

    use Cwd; 
    $ProjectName = "Project"; # This is a variable supplied by the user 
    
    $directory = getcwd(); 
    $directory =~ s/(.+?)([^\\\/])$/$1$2\//g; # Append "/" if not terminating with forward/back slash 
    $directory .= $ProjectName."\/"; 
    
    print $directory."\n"; 
    

答えて

9

利用File::Specの代わりに、独自のパス操作ルーチンを作ります。

use Cwd; 
use File::Spec; 

$ProjectName = "Project"; 

$cwd = getcwd(); 
$directory = File::Spec->catdir($cwd, $ProjectName); 

print "$directory\n"; 
+0

File :: Specを知っていただきありがとうございます。 catdirとcatfileを使うようにスクリプト全体を変更しなければならない。私はそれが長期的には良いと確信しています。 – Andy

3

"D:"はボリューム指定子であるため、最初のケースにはスラッシュが含まれています。有効なディレクトリ名ではありません。 "D:/"はUnix/Linuxのルートディレクトリに似ています。 catdirを行い

use Cwd; 
use File::Spec::Functions qw(catdir); 

my $directory = catdir(getcwd(), $ProjectName); 

注こと:

迅速かつ汚いソリューション:あなたは非オブジェクト指向のインターフェイスを好む場合

$directory .= '/' unless $directory =~ m|/$|; 

堅牢かつポータブルソリューションについては、File::SpecまたはFile::Spec::Functionsを使用には末尾のスラッシュが含まれ、File :: Specはホストオペレーティングシステムのディレクトリ区切り文字を使用してパスを作成します。 (Windowsのバックスラッシュなど)。

+0

いずれにしても気にせず、File :: Specは私にとってうまくいくと思います。ありがとうございました。 – Andy

関連する問題