2009-05-28 8 views
2

Je crée un script Perl pour attacher une autre variable à la fin du répertoire de travail en cours, mais j'ai des problèmes avec l'utilisation du module.Perl getcwd fin des barres obliques

  1. Si je cours getcwd de D:\, la valeur retournée est

    D:/ (with forward slash) 
    

    Si je lance getcwd de D:\Temp\, la valeur retournée est

    D:/temp (without forward slash) 
    

    Cela rend la situation très délicate, car si je fais simplement:

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

    Je finissons avec

    D:/Project (correct) 
    

    ou

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

    Est-ce une fonctionnalité dans Cwd? Cela ne semble pas être dans la documentation. J'ai conçu le code suivant pour résoudre ce problème. Il faut 3 lignes pour le faire. Quelqu'un d'entre vous peut-il voir un moyen plus concis?

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

Répondre

9

Utilisez File::Spec au lieu de faire vos propres routines de manipulation de chemin.

use Cwd; 
use File::Spec; 

$ProjectName = "Project"; 

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

print "$directory\n"; 
+0

Merci d'avoir fait connaître File :: Spec. Je dois changer tout mon script pour utiliser catdir et catfile. Je suis sûr que c'est mieux à long terme. – Andy

3

Le premier cas inclut le slash final car "D:" est un spécificateur de volume. Ce n'est pas un nom de répertoire valide. "D: /" est analogue au répertoire racine sous Unix/Linux.

Solution rapide et sale:

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

Pour une solution robuste et portable, utilisez File::Spec ou File::Spec::Functions si vous préférez une interface non-orienté objet:

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

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

Notez que catdir-t pas inclure la barre oblique finale, et que File :: Spec crée des chemins en utilisant le séparateur de répertoire pour le système d'exploitation hôte. (par exemple, des barres obliques inverses sous Windows).

+0

Cela ne me dérange pas non plus, et je pense que File :: Spec ira bien pour moi. Je vous remercie. – Andy

Questions connexes