Perl getcwd结束前斜杠

Perl getcwd结束前斜杠,perl,cwd,Perl,Cwd,我正在编写一个Perl脚本,将另一个变量附加到当前工作目录的末尾,但在使用该模块时遇到了问题 如果从D:\运行getcwd,则返回的值为 D:/ (with forward slash) D:/temp (without forward slash) 如果从D:\Temp\运行getcwd,则返回的值为 D:/ (with forward slash) D:/temp (without forward slash) 这使得情况变得相当棘手,因为如果我只是这样做: use Cwd;

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

  • 如果从
    D:\
    运行getcwd,则返回的值为

    D:/ (with forward slash)  
    
    D:/temp (without forward slash)
    
    如果从
    D:\Temp\
    运行getcwd,则返回的值为

    D:/ (with forward slash)  
    
    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)  
    

    这是
    Cwd
    中的功能吗?它似乎不在文档中

  • 我想出了以下代码来解决这个问题。做这件事需要三行。你们谁能想出一个更简洁的方法

    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";
    
  • 使用而不是制作自己的路径操作例程

    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|/$|;
    
    对于健壮且可移植的解决方案,使用或如果您更喜欢非面向对象的接口:

    use Cwd;
    use File::Spec::Functions qw(catdir);
    
    my $directory = catdir(getcwd(), $ProjectName);
    

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

    感谢您让我们了解File::Spec。我必须将整个脚本更改为使用catdir和catfile。我确信从长远来看它会更好。我不介意任何一种方式,我认为File::Spec对我来说都很好。非常感谢。