Я использую File :: Spec в системе Unix, чтобы получить абсолютный путь к файлу:
use File::Spec::Functions qw(:ALL);
use strict;
use warnings;
use feature qw(say);
my $file = "../../this/is/a/test";
say rel2abs($file);
Это распечатывает /directory/to/program/../../this/is/a/test
.Я бы хотел, чтобы он распечатал /directory/this/is/a/test
.
Я видел метод no_upwards
, и вот описание:
Given a list of file names, strip out those that refer to a parent directory.
(Does not strip symlinks, only '.', '..', and equivalents.)
@paths = File::Spec->no_upwards( @paths );
Однако, похоже, это не сработало.Вместо этого я посмотрел код в модуле File :: Spec и обнаружил:
sub no_upwards {
my $self = shift;
return grep(!/^\.{1,2}\z/s, @_);
}
Итак, что делает этот метод и как мне заставить его работать?
Если я правильно понял, это берет список каталогов, а затем удаляет все те каталоги, которые .
или ..
.(Согласно Perldoc \z
означает, что соответствует только в конце строки ).
Существует ли независимый от платформы способ свертыванияэти специальные каталоги?Что должен делать no_upwards
и как вы его используете?Я попытался:
say no_upwards(rel2abs($file));
Есть ли другой метод, который я должен использовать?