2009-05-28 9 views
2

Ich mache ein Perl-Skript, um eine andere Variable an das Ende des aktuellen Arbeitsverzeichnisses anzuhängen, aber ich habe Probleme mit der Verwendung des Moduls.Perl getcwd Ende vorwärts Schrägstriche

  1. Wenn ich von D:\ getcwd laufen, kehrte der Wert

    D:/ (with forward slash) 
    

    ist Wenn ich getcwd von D:\Temp\ laufen, kehrte der Wert

    D:/temp (without forward slash) 
    

    Dies ist die Situation ziemlich schwierig macht, weil wenn ich es einfach mache:

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

    Ich werde oben mit beiden

    D:/Project (correct) 
    

    oder

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

    Ist dies ein Merkmal in Cwd enden? Es scheint nicht in der Dokumentation zu sein.

  2. Ich habe den folgenden Code entwickelt, um dieses Problem zu lösen. Es dauert 3 Zeilen, um es zu tun. Kann jemand von euch einen prägnanteren Weg sehen?

    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"; 
    

Antwort

9

Verwenden File::Spec stattdessen Ihren eigenen Weg Manipulation Routinen zu machen.

use Cwd; 
use File::Spec; 

$ProjectName = "Project"; 

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

print "$directory\n"; 
+0

Vielen Dank für die Bekanntmachung von File :: Spec. Ich muss mein gesamtes Skript ändern, um catdir und catfile zu verwenden. Ich bin mir sicher, dass es auf lange Sicht besser ist. – Andy

3

Der erste Fall enthält den abschließenden Schrägstrich, weil "D:" ein Volume-Spezifizierer ist. Es ist kein gültiger Verzeichnisname. "D: /" ist analog zum Wurzelverzeichnis in Unix/Linux.

quick and dirty Lösung:

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

Für eine robuste und tragbare Lösung, verwenden File::Spec oder File::Spec::Functions, wenn Sie eine nicht-objektorientierte Schnittstelle bevorzugen:

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

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

Beachten Sie, dass catdir tut nicht enthält den abschließenden Schrägstrich und File :: Spec erstellt Pfade unter Verwendung des Verzeichnistrennzeichens für das Hostbetriebssystem. (z. B. Backslashes unter Windows).

+0

Mir egal, und ich denke, File :: Spec wird gut für mich tun. Vielen Dank. – Andy