Perl getcwd заканчивая косой чертой
Я делаю Perl-скрипт для присоединения другой переменной к концу текущего рабочего каталога, но у меня возникают проблемы с использованием модуля.
Если я запускаю 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
? Кажется, этого нет в документации.Я придумал следующий код для решения этой проблемы. Требуется 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).