Perl getcwd заканчивая косой чертой

Я делаю 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 ответа

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

use Cwd;
use File::Spec;

$ProjectName = "Project";

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

print "$directory\n";

Первый случай включает косую черту, потому что "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).

Другие вопросы по тегам