我正在使用Perl脚本将另一个变量附加到当前工作目录的末尾,但是我在使用该模块时遇到了问题。
如果我从D:\
运行getcwd,则返回的值为
D:/ (with forward slash)
如果我从D:\Temp\
运行getcwd,则返回的值为
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";
答案 0 :(得分:9)
使用File::Spec而不是制作自己的路径操作例程。
use Cwd;
use File::Spec;
$ProjectName = "Project";
$cwd = getcwd();
$directory = File::Spec->catdir($cwd, $ProjectName);
print "$directory\n";
答案 1 :(得分:3)
第一种情况是包括尾部斜杠,因为“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上的反斜杠)。