【问题标题】:Construct absolute filename from a filename and a directory name从文件名和目录名构造绝对文件名
【发布时间】:2014-03-10 23:26:06
【问题描述】:

我有两个价值观:

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

我需要构造一个明确的绝对文件名(以 / 开头,不带任何 ../ 且不带 ./),它对应于在目录为当前目录时访问此文件。

我需要在 Unix 中的 Perl 中执行此操作。

我已经尝试过use File::Path;,但这不起作用(错误?):

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

输出:

/boot/xx

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

【问题讨论】:

  • 您的代码使用Path::ClassPath::Class::File,但您说您使用的是File::Path……这有点令人困惑。不过,Path::Class 确实将自己记录为File::Path 之上的一个层。我认为您的问题是 GIGO:Garbage In,Garbage Out。文件名不应包含斜杠;当它发生时,你得到你所得到的。文件名是通过将目录名列表(在您的示例中为一个)添加到文件名来创建的。

标签: perl path directory filepath


【解决方案1】:

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();

【讨论】:

  • 什么意思? $fileObj->absolute 是文件的绝对路径,没有../.
【解决方案2】:
# ("/base/path", "x") -> "/base/path/x"
# ("/base/path", "../x") -> "/base/x"
# ("/base/path", "/x") -> "/x"
子 AbsoluteNormalizedPath {
  我的 ($dir, $filename) = @_;
  $filename = "$dir/$filename" 除非 $filename =~ m{^/};
  我的@components = 拆分 m{/+}, $filename;
  转移@components; # Первый компонент всегда - пустая строка, вырезаем его
  # Компоненты без ".." и ".". Работает как стек: добавляем обычные компоненты, убираем последние компонент на "..", игнорируем ".":
  我的@normalizedComponents;
  foreach 我的 $component (@components) {
    接下来如果 $component eq '.';
    if($component eq '..') {
      # В Unix 父 директория корневой директории - сама корневая директория, то есть /.. - то же самое, что /
      # Так что, если список пустой - это не ошибка, оставляем его пустым (что соответсвует корневой директории)。
      如果@normalizedComponents,则弹出@normalizedComponents;
    } 别的 {
      推@normalizedComponents,$组件;
    }
  }
  返回 '​​/' 。加入('/',@normalizedComponents);
}

【讨论】:

    猜你喜欢
    • 2012-10-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-03-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多