0

是否有一个函数说f(在基本 Perl 或库中)这样:

f("/a/b/c", "./d") == "/a/b/c/d"
f("/a/b/c", "../d") == "/a/b/d"
f("/a/b/c", "/d") == "/d"

基本上,它会返回重复cding 产生的目录。

4

2 回答 2

7

Core 的File :: Spec有这样的功能(rel2abs

use Path::Class qw( dir );
say dir('./d')->absolute('/a/b/c');    # /a/b/c/d
say dir('../d')->absolute('/a/b/c');   # /a/b/d
say dir('/d')->absolute('/a/b/c');     # /d

如果您要创建文件的路径,请使用file而不是。dir

顺便说一句,./d只是一种罗嗦的写作方式d


糟糕,在 unix 系统上,它返回中间一个,因为如果不检查文件系统/a/b/c/../d就不可能知道/a/b/c/../d方法。/a/b/d(实际上可能是/a/b/e/f/d。)在我的脑海中,我不知道有任何工具可以通过使用 pwd 以外的基础检查文件系统来生成绝对路径。

于 2013-03-07T05:52:59.580 回答
0

可能这缺少很多东西,但是一个函数f可以是这样的:

use warnings;
use strict;

sub f {
  my ($s, $cd) = @_; 
  return $cd if ($cd =~ m!^/!); # return path if abs
  $cd =~ s!//+!/!g;
  my @v = split(/\//, $cd);
  my @i = split(/\//, $s);
  for my $c (@v) {
    next if $c eq ".";
    pop @i, next if $c eq "..";
    push @i, $c; 
  }
  return join("/", @i);
}

my @p = ( 
  ["/a/b/c", "./d"], 
  ["a/b/c", "../d"], 
  ["/a/b/c/", "/d"], 
  ["a/b/c/e/f/g", "../../c/e/../d"]);

print f(@$_), "\n" for @p; 
于 2013-03-07T06:29:07.953 回答