是否有一个函数说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"
基本上,它会返回重复cd
ing 产生的目录。
是否有一个函数说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"
基本上,它会返回重复cd
ing 产生的目录。
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 以外的基础检查文件系统来生成绝对路径。
可能这缺少很多东西,但是一个函数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;