Perl getcwd结束正斜杠

时间:2009-05-28 17:39:09

标签: perl cwd

我正在使用Perl脚本将另一个变量附加到当前工作目录的末尾,但是我在使用该模块时遇到了问题。

  1. 如果我从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中的一项功能吗?它似乎不在文档中。

  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 个答案:

答案 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::SpecFile::Spec::Functions

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

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

请注意catdir 包含尾部斜杠,而File :: Spec使用主机操作系统的目录分隔符构建路径。 (例如Windows上的反斜杠)。