2

我正在做一个 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";
    
4

2 回答 2

9

使用File::Spec而不是制作自己的路径操作例程。

use Cwd;
use File::Spec;

$ProjectName = "Project";

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

print "$directory\n";
于 2009-05-28T17:54:33.067 回答
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 上的反斜杠)。

于 2009-05-28T17:58:17.677 回答