2014-02-12 67 views
0

我有两个值:从文件名和目录名构造绝对路径

  • 当前目录名
  • 绝对或相对的文件名

我需要构建一个明确的绝对文件名(以/开头,没有任何../,没有./),与目录是当前目录时访问该文件相对应。

我需要在Unix中使用Perl进行此操作。

我试过use File::Path;但不工作的权利(错误):

perl -MPath::Class -e 'my $fileObj = Path::Class::File->new("/boot", "/xx"); 
         print $fileObj->absolute, "\n";' 

输出:

/boot/xx 

但它应该打印/xx,因为它是一个绝对路径,它不应该依赖于当前目录!

+2

您的代码使用'路径:: Class'和'路径::类:: File',但你说你正在使用'文件: :路径......这有点令人困惑。尽管如此,[Path :: Class](http://search.cpan.org/perldoc?Path%3A%3AClass)确实将自己记录为'File :: Path'上的图层。我认为你的问题是GIGO:垃圾进入,垃​​圾进出。文件名不应该包含斜线;当它发生时,你会得到你所得到的。文件名是通过在文件名前加上目录名称列表(在你的例子中)来创建的。 –

回答

0
# ("/base/path", "x") -> "/base/path/x" 
# ("/base/path", "../x") -> "/base/x" 
# ("/base/path", "/x") -> "/x" 
sub AbsoluteNormalizedPath { 
    my ($dir, $filename) = @_; 
    $filename = "$dir/$filename" unless $filename =~ m{^/}; 
    my @components = split m{/+}, $filename; 
    shift @components; # Первый компонент всегда - пустая строка, вырезаем его 
    # Компоненты без ".." и ".". Работает как стек: добавляем обычные компоненты, убираем последние компонент на "..", игнорируем ".": 
    my @normalizedComponents; 
    foreach my $component (@components) { 
    next if $component eq '.'; 
    if($component eq '..') { 
     # В Unix parent директория корневой директории - сама корневая директория, то есть /.. - то же самое, что/
     # Так что, если список пустой - это не ошибка, оставляем его пустым (что соответсвует корневой директории). 
     pop @normalizedComponents if @normalizedComponents; 
    } else { 
     push @normalizedComponents, $component; 
    } 
    } 
    return '/' . join('/', @normalizedComponents); 
}
2

Path::Class使用整个路径来确定文件是绝对的还是相对的,所以在这个例子中是“/ boot/xx”。输出的字符串。为了解决你的问题,你需要这样的事:

use Path::Class 

my $fileObj = Path::Class::File->new("/xx"); 

$fileObj = Path::Class::File->new("/boot",$fileObj->relative()) if $fileObj->is_relative(); 
+0

Id不能解决../和./ – porton

+0

的问题你是什么意思? $ fileObj-> absolute是没有../的文件的绝对路径。 – user1937198

相关问题