Perl getcwd заканчивая косой чертой - PullRequest
2 голосов
/ 28 мая 2009

Я делаю Perl-скрипт для присоединения другой переменной к концу текущего рабочего каталога, но у меня возникают проблемы с использованием модуля.

  1. Если я запускаю getcwd из D:\, возвращаемое значение равно

    D:/ (with forward slash)  
    

    Если я запускаю getcwd из D:\Temp\, возвращается значение

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

Ответы [ 2 ]

9 голосов
/ 28 мая 2009

Используйте File :: Spec вместо того, чтобы создавать свои собственные процедуры манипуляции путями.

use Cwd;
use File::Spec;

$ProjectName = "Project";

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

print "$directory\n";
3 голосов
/ 28 мая 2009

Первый случай включает косую черту, потому что "D:" является спецификатором объема. Это не правильное имя каталога. «D: /» аналогичен корневому каталогу в Unix / Linux.

Быстрое и грязное решение:

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

Для надежного и портативного решения используйте File :: Spec или File :: Spec :: Functions , если вы предпочитаете не объектно-ориентированный интерфейс:

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

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

Обратите внимание, что catdir не включает , а не , включая косую черту, и что File :: Spec создает пути, используя разделитель каталогов для операционной системы хоста. (например, обратная косая черта в Windows).

...